go.net/0000755000175100017510000000000012235222116011320 5ustar spirospirogo.net/dict/0000755000175100017510000000000012235217213012245 5ustar spirospirogo.net/dict/dict.go0000644000175100017510000001071212235217213013520 0ustar spirospiro// Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package dict implements the Dictionary Server Protocol // as defined in RFC 2229. package dict import ( "net/textproto" "strconv" "strings" ) // A Client represents a client connection to a dictionary server. type Client struct { text *textproto.Conn } // Dial returns a new client connected to a dictionary server at // addr on the given network. func Dial(network, addr string) (*Client, error) { text, err := textproto.Dial(network, addr) if err != nil { return nil, err } _, _, err = text.ReadCodeLine(220) if err != nil { text.Close() return nil, err } return &Client{text: text}, nil } // Close closes the connection to the dictionary server. func (c *Client) Close() error { return c.text.Close() } // A Dict represents a dictionary available on the server. type Dict struct { Name string // short name of dictionary Desc string // long description } // Dicts returns a list of the dictionaries available on the server. func (c *Client) Dicts() ([]Dict, error) { id, err := c.text.Cmd("SHOW DB") if err != nil { return nil, err } c.text.StartResponse(id) defer c.text.EndResponse(id) _, _, err = c.text.ReadCodeLine(110) if err != nil { return nil, err } lines, err := c.text.ReadDotLines() if err != nil { return nil, err } _, _, err = c.text.ReadCodeLine(250) dicts := make([]Dict, len(lines)) for i := range dicts { d := &dicts[i] a, _ := fields(lines[i]) if len(a) < 2 { return nil, textproto.ProtocolError("invalid dictionary: " + lines[i]) } d.Name = a[0] d.Desc = a[1] } return dicts, err } // A Defn represents a definition. type Defn struct { Dict Dict // Dict where definition was found Word string // Word being defined Text []byte // Definition text, typically multiple lines } // Define requests the definition of the given word. // The argument dict names the dictionary to use, // the Name field of a Dict returned by Dicts. // // The special dictionary name "*" means to look in all the // server's dictionaries. // The special dictionary name "!" means to look in all the // server's dictionaries in turn, stopping after finding the word // in one of them. func (c *Client) Define(dict, word string) ([]*Defn, error) { id, err := c.text.Cmd("DEFINE %s %q", dict, word) if err != nil { return nil, err } c.text.StartResponse(id) defer c.text.EndResponse(id) _, line, err := c.text.ReadCodeLine(150) if err != nil { return nil, err } a, _ := fields(line) if len(a) < 1 { return nil, textproto.ProtocolError("malformed response: " + line) } n, err := strconv.Atoi(a[0]) if err != nil { return nil, textproto.ProtocolError("invalid definition count: " + a[0]) } def := make([]*Defn, n) for i := 0; i < n; i++ { _, line, err = c.text.ReadCodeLine(151) if err != nil { return nil, err } a, _ := fields(line) if len(a) < 3 { // skip it, to keep protocol in sync i-- n-- def = def[0:n] continue } d := &Defn{Word: a[0], Dict: Dict{a[1], a[2]}} d.Text, err = c.text.ReadDotBytes() if err != nil { return nil, err } def[i] = d } _, _, err = c.text.ReadCodeLine(250) return def, err } // Fields returns the fields in s. // Fields are space separated unquoted words // or quoted with single or double quote. func fields(s string) ([]string, error) { var v []string i := 0 for { for i < len(s) && (s[i] == ' ' || s[i] == '\t') { i++ } if i >= len(s) { break } if s[i] == '"' || s[i] == '\'' { q := s[i] // quoted string var j int for j = i + 1; ; j++ { if j >= len(s) { return nil, textproto.ProtocolError("malformed quoted string") } if s[j] == '\\' { j++ continue } if s[j] == q { j++ break } } v = append(v, unquote(s[i+1:j-1])) i = j } else { // atom var j int for j = i; j < len(s); j++ { if s[j] == ' ' || s[j] == '\t' || s[j] == '\\' || s[j] == '"' || s[j] == '\'' { break } } v = append(v, s[i:j]) i = j } if i < len(s) { c := s[i] if c != ' ' && c != '\t' { return nil, textproto.ProtocolError("quotes not on word boundaries") } } } return v, nil } func unquote(s string) string { if strings.Index(s, "\\") < 0 { return s } b := []byte(s) w := 0 for r := 0; r < len(b); r++ { c := b[r] if c == '\\' { r++ c = b[r] } b[w] = c w++ } return string(b[0:w]) } go.net/ipv4/0000755000175100017510000000000012235217213012204 5ustar spirospirogo.net/ipv4/control_plan9.go0000644000175100017510000000121012235217213015310 0ustar spirospiro// 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. package ipv4 import "syscall" func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error { // TODO(mikio): Implement this return syscall.EPLAN9 } func newControlMessage(opt *rawOpt) []byte { // TODO(mikio): Implement this return nil } func parseControlMessage(b []byte) (*ControlMessage, error) { // TODO(mikio): Implement this return nil, syscall.EPLAN9 } func marshalControlMessage(cm *ControlMessage) []byte { // TODO(mikio): Implement this return nil } go.net/ipv4/control_bsd.go0000644000175100017510000000534612235217213015053 0ustar spirospiro// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin freebsd netbsd openbsd package ipv4 import ( "net" "os" "syscall" "unsafe" ) func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error { opt.Lock() defer opt.Unlock() if cf&FlagTTL != 0 { if err := setIPv4ReceiveTTL(fd, on); err != nil { return err } if on { opt.set(FlagTTL) } else { opt.clear(FlagTTL) } } if cf&FlagDst != 0 { if err := setIPv4ReceiveDestinationAddress(fd, on); err != nil { return err } if on { opt.set(FlagDst) } else { opt.clear(FlagDst) } } if cf&FlagInterface != 0 { if err := setIPv4ReceiveInterface(fd, on); err != nil { return err } if on { opt.set(FlagInterface) } else { opt.clear(FlagInterface) } } return nil } func newControlMessage(opt *rawOpt) (oob []byte) { opt.Lock() defer opt.Unlock() l, off := 0, 0 if opt.isset(FlagTTL) { l += syscall.CmsgSpace(1) } if opt.isset(FlagDst) { l += syscall.CmsgSpace(net.IPv4len) } if opt.isset(FlagInterface) { l += syscall.CmsgSpace(syscall.SizeofSockaddrDatalink) } if l > 0 { oob = make([]byte, l) if opt.isset(FlagTTL) { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIP m.Type = syscall.IP_RECVTTL m.SetLen(syscall.CmsgLen(1)) off += syscall.CmsgSpace(1) } if opt.isset(FlagDst) { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIP m.Type = syscall.IP_RECVDSTADDR m.SetLen(syscall.CmsgLen(net.IPv4len)) off += syscall.CmsgSpace(net.IPv4len) } if opt.isset(FlagInterface) { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIP m.Type = syscall.IP_RECVIF m.SetLen(syscall.CmsgLen(syscall.SizeofSockaddrDatalink)) off += syscall.CmsgSpace(syscall.SizeofSockaddrDatalink) } } return } func parseControlMessage(b []byte) (*ControlMessage, error) { if len(b) == 0 { return nil, nil } cmsgs, err := syscall.ParseSocketControlMessage(b) if err != nil { return nil, os.NewSyscallError("parse socket control message", err) } cm := &ControlMessage{} for _, m := range cmsgs { if m.Header.Level != ianaProtocolIP { continue } switch m.Header.Type { case syscall.IP_RECVTTL: cm.TTL = int(*(*byte)(unsafe.Pointer(&m.Data[:1][0]))) case syscall.IP_RECVDSTADDR: cm.Dst = m.Data[:net.IPv4len] case syscall.IP_RECVIF: sadl := (*syscall.SockaddrDatalink)(unsafe.Pointer(&m.Data[0])) cm.IfIndex = int(sadl.Index) } } return cm, nil } func marshalControlMessage(cm *ControlMessage) []byte { // TODO(mikio): Implement IP_PKTINFO stuff when OS X 10.8 comes return nil } go.net/ipv4/header_test.go0000644000175100017510000000415212235217213015024 0ustar spirospiro// 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. package ipv4_test import ( "bytes" "code.google.com/p/go.net/ipv4" "net" "reflect" "runtime" "testing" ) var ( wireHeaderFromKernel = [ipv4.HeaderLen]byte{ 0x45, 0x01, 0xbe, 0xef, 0xca, 0xfe, 0x45, 0xdc, 0xff, 0x01, 0xde, 0xad, 172, 16, 254, 254, 192, 168, 0, 1, } wireHeaderToKernel = [ipv4.HeaderLen]byte{ 0x45, 0x01, 0xbe, 0xef, 0xca, 0xfe, 0x45, 0xdc, 0xff, 0x01, 0xde, 0xad, 172, 16, 254, 254, 192, 168, 0, 1, } wireHeaderFromTradBSDKernel = [ipv4.HeaderLen]byte{ 0x45, 0x01, 0xdb, 0xbe, 0xca, 0xfe, 0xdc, 0x45, 0xff, 0x01, 0xde, 0xad, 172, 16, 254, 254, 192, 168, 0, 1, } wireHeaderToTradBSDKernel = [ipv4.HeaderLen]byte{ 0x45, 0x01, 0xef, 0xbe, 0xca, 0xfe, 0xdc, 0x45, 0xff, 0x01, 0xde, 0xad, 172, 16, 254, 254, 192, 168, 0, 1, } // TODO(mikio): Add platform dependent wire header formats when // we support new platforms. testHeader = &ipv4.Header{ Version: ipv4.Version, Len: ipv4.HeaderLen, TOS: 1, TotalLen: 0xbeef, ID: 0xcafe, Flags: ipv4.DontFragment, FragOff: 1500, TTL: 255, Protocol: 1, Checksum: 0xdead, Src: net.IPv4(172, 16, 254, 254), Dst: net.IPv4(192, 168, 0, 1), } ) func TestMarshalHeader(t *testing.T) { b, err := testHeader.Marshal() if err != nil { t.Fatalf("ipv4.Header.Marshal failed: %v", err) } var wh []byte switch runtime.GOOS { case "linux", "openbsd": wh = wireHeaderToKernel[:] default: wh = wireHeaderToTradBSDKernel[:] } if !bytes.Equal(b, wh) { t.Fatalf("ipv4.Header.Marshal failed: %#v not equal %#v", b, wh) } } func TestParseHeader(t *testing.T) { var wh []byte switch runtime.GOOS { case "linux", "openbsd": wh = wireHeaderFromKernel[:] default: wh = wireHeaderFromTradBSDKernel[:] } h, err := ipv4.ParseHeader(wh) if err != nil { t.Fatalf("ipv4.ParseHeader failed: %v", err) } if !reflect.DeepEqual(h, testHeader) { t.Fatalf("ipv4.ParseHeader failed: %#v not equal %#v", h, testHeader) } } go.net/ipv4/helper_unix.go0000644000175100017510000000211412235217213015053 0ustar spirospiro// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin freebsd linux netbsd openbsd package ipv4 import ( "net" "reflect" ) func (c *genericOpt) sysfd() (int, error) { switch p := c.Conn.(type) { case *net.TCPConn, *net.UDPConn, *net.IPConn: return sysfd(p) } return 0, errInvalidConnType } func (c *dgramOpt) sysfd() (int, error) { switch p := c.PacketConn.(type) { case *net.UDPConn, *net.IPConn: return sysfd(p.(net.Conn)) } return 0, errInvalidConnType } func (c *payloadHandler) sysfd() (int, error) { return sysfd(c.PacketConn.(net.Conn)) } func (c *packetHandler) sysfd() (int, error) { return sysfd(c.c) } func sysfd(c net.Conn) (int, error) { cv := reflect.ValueOf(c) switch ce := cv.Elem(); ce.Kind() { case reflect.Struct: netfd := ce.FieldByName("conn").FieldByName("fd") switch fe := netfd.Elem(); fe.Kind() { case reflect.Struct: fd := fe.FieldByName("sysfd") return int(fd.Int()), nil } } return 0, errInvalidConnType } go.net/ipv4/iana.go0000644000175100017510000002241712235217213013451 0ustar spirospiro// go run gen.go // GENERATED BY THE COMMAND ABOVE; DO NOT EDIT package ipv4 // Internet Control Message Protocol (ICMP) Parameters, Updated: 2013-04-19 const ( ICMPTypeEchoReply ICMPType = 0 // Echo Reply ICMPTypeDestinationUnreachable ICMPType = 3 // Destination Unreachable ICMPTypeRedirect ICMPType = 5 // Redirect ICMPTypeEcho ICMPType = 8 // Echo ICMPTypeRouterAdvertisement ICMPType = 9 // Router Advertisement ICMPTypeRouterSolicitation ICMPType = 10 // Router Solicitation ICMPTypeTimeExceeded ICMPType = 11 // Time Exceeded ICMPTypeParameterProblem ICMPType = 12 // Parameter Problem ICMPTypeTimestamp ICMPType = 13 // Timestamp ICMPTypeTimestampReply ICMPType = 14 // Timestamp Reply ICMPTypePhoturis ICMPType = 40 // Photuris ) // Internet Control Message Protocol (ICMP) Parameters, Updated: 2013-04-19 var icmpTypes = map[ICMPType]string{ 0: "echo reply", 3: "destination unreachable", 5: "redirect", 8: "echo", 9: "router advertisement", 10: "router solicitation", 11: "time exceeded", 12: "parameter problem", 13: "timestamp", 14: "timestamp reply", 40: "photuris", } // Protocol Numbers, Updated: 2013-02-17 const ( ianaProtocolIP = 0 // IPv4 encapsulation, pseudo protocol number ianaProtocolHOPOPT = 0 // IPv6 Hop-by-Hop Option ianaProtocolICMP = 1 // Internet Control Message ianaProtocolIGMP = 2 // Internet Group Management ianaProtocolGGP = 3 // Gateway-to-Gateway ianaProtocolIPv4 = 4 // IPv4 encapsulation ianaProtocolST = 5 // Stream ianaProtocolTCP = 6 // Transmission Control ianaProtocolCBT = 7 // CBT ianaProtocolEGP = 8 // Exterior Gateway Protocol ianaProtocolIGP = 9 // any private interior gateway (used by Cisco for their IGRP) ianaProtocolBBNRCCMON = 10 // BBN RCC Monitoring ianaProtocolNVPII = 11 // Network Voice Protocol ianaProtocolPUP = 12 // PUP ianaProtocolARGUS = 13 // ARGUS ianaProtocolEMCON = 14 // EMCON ianaProtocolXNET = 15 // Cross Net Debugger ianaProtocolCHAOS = 16 // Chaos ianaProtocolUDP = 17 // User Datagram ianaProtocolMUX = 18 // Multiplexing ianaProtocolDCNMEAS = 19 // DCN Measurement Subsystems ianaProtocolHMP = 20 // Host Monitoring ianaProtocolPRM = 21 // Packet Radio Measurement ianaProtocolXNSIDP = 22 // XEROX NS IDP ianaProtocolTRUNK1 = 23 // Trunk-1 ianaProtocolTRUNK2 = 24 // Trunk-2 ianaProtocolLEAF1 = 25 // Leaf-1 ianaProtocolLEAF2 = 26 // Leaf-2 ianaProtocolRDP = 27 // Reliable Data Protocol ianaProtocolIRTP = 28 // Internet Reliable Transaction ianaProtocolISOTP4 = 29 // ISO Transport Protocol Class 4 ianaProtocolNETBLT = 30 // Bulk Data Transfer Protocol ianaProtocolMFENSP = 31 // MFE Network Services Protocol ianaProtocolMERITINP = 32 // MERIT Internodal Protocol ianaProtocolDCCP = 33 // Datagram Congestion Control Protocol ianaProtocol3PC = 34 // Third Party Connect Protocol ianaProtocolIDPR = 35 // Inter-Domain Policy Routing Protocol ianaProtocolXTP = 36 // XTP ianaProtocolDDP = 37 // Datagram Delivery Protocol ianaProtocolIDPRCMTP = 38 // IDPR Control Message Transport Proto ianaProtocolTPPP = 39 // TP++ Transport Protocol ianaProtocolIL = 40 // IL Transport Protocol ianaProtocolIPv6 = 41 // IPv6 encapsulation ianaProtocolSDRP = 42 // Source Demand Routing Protocol ianaProtocolIPv6Route = 43 // Routing Header for IPv6 ianaProtocolIPv6Frag = 44 // Fragment Header for IPv6 ianaProtocolIDRP = 45 // Inter-Domain Routing Protocol ianaProtocolRSVP = 46 // Reservation Protocol ianaProtocolGRE = 47 // Generic Routing Encapsulation ianaProtocolDSR = 48 // Dynamic Source Routing Protocol ianaProtocolBNA = 49 // BNA ianaProtocolESP = 50 // Encap Security Payload ianaProtocolAH = 51 // Authentication Header ianaProtocolINLSP = 52 // Integrated Net Layer Security TUBA ianaProtocolSWIPE = 53 // IP with Encryption ianaProtocolNARP = 54 // NBMA Address Resolution Protocol ianaProtocolMOBILE = 55 // IP Mobility ianaProtocolTLSP = 56 // Transport Layer Security Protocol using Kryptonet key management ianaProtocolSKIP = 57 // SKIP ianaProtocolIPv6ICMP = 58 // ICMP for IPv6 ianaProtocolIPv6NoNxt = 59 // No Next Header for IPv6 ianaProtocolIPv6Opts = 60 // Destination Options for IPv6 ianaProtocolCFTP = 62 // CFTP ianaProtocolSATEXPAK = 64 // SATNET and Backroom EXPAK ianaProtocolKRYPTOLAN = 65 // Kryptolan ianaProtocolRVD = 66 // MIT Remote Virtual Disk Protocol ianaProtocolIPPC = 67 // Internet Pluribus Packet Core ianaProtocolSATMON = 69 // SATNET Monitoring ianaProtocolVISA = 70 // VISA Protocol ianaProtocolIPCV = 71 // Internet Packet Core Utility ianaProtocolCPNX = 72 // Computer Protocol Network Executive ianaProtocolCPHB = 73 // Computer Protocol Heart Beat ianaProtocolWSN = 74 // Wang Span Network ianaProtocolPVP = 75 // Packet Video Protocol ianaProtocolBRSATMON = 76 // Backroom SATNET Monitoring ianaProtocolSUNND = 77 // SUN ND PROTOCOL-Temporary ianaProtocolWBMON = 78 // WIDEBAND Monitoring ianaProtocolWBEXPAK = 79 // WIDEBAND EXPAK ianaProtocolISOIP = 80 // ISO Internet Protocol ianaProtocolVMTP = 81 // VMTP ianaProtocolSECUREVMTP = 82 // SECURE-VMTP ianaProtocolVINES = 83 // VINES ianaProtocolTTP = 84 // TTP ianaProtocolIPTM = 84 // Protocol Internet Protocol Traffic Manager ianaProtocolNSFNETIGP = 85 // NSFNET-IGP ianaProtocolDGP = 86 // Dissimilar Gateway Protocol ianaProtocolTCF = 87 // TCF ianaProtocolEIGRP = 88 // EIGRP ianaProtocolOSPFIGP = 89 // OSPFIGP ianaProtocolSpriteRPC = 90 // Sprite RPC Protocol ianaProtocolLARP = 91 // Locus Address Resolution Protocol ianaProtocolMTP = 92 // Multicast Transport Protocol ianaProtocolAX25 = 93 // AX.25 Frames ianaProtocolIPIP = 94 // IP-within-IP Encapsulation Protocol ianaProtocolMICP = 95 // Mobile Internetworking Control Pro. ianaProtocolSCCSP = 96 // Semaphore Communications Sec. Pro. ianaProtocolETHERIP = 97 // Ethernet-within-IP Encapsulation ianaProtocolENCAP = 98 // Encapsulation Header ianaProtocolGMTP = 100 // GMTP ianaProtocolIFMP = 101 // Ipsilon Flow Management Protocol ianaProtocolPNNI = 102 // PNNI over IP ianaProtocolPIM = 103 // Protocol Independent Multicast ianaProtocolARIS = 104 // ARIS ianaProtocolSCPS = 105 // SCPS ianaProtocolQNX = 106 // QNX ianaProtocolAN = 107 // Active Networks ianaProtocolIPComp = 108 // IP Payload Compression Protocol ianaProtocolSNP = 109 // Sitara Networks Protocol ianaProtocolCompaqPeer = 110 // Compaq Peer Protocol ianaProtocolIPXinIP = 111 // IPX in IP ianaProtocolVRRP = 112 // Virtual Router Redundancy Protocol ianaProtocolPGM = 113 // PGM Reliable Transport Protocol ianaProtocolL2TP = 115 // Layer Two Tunneling Protocol ianaProtocolDDX = 116 // D-II Data Exchange (DDX) ianaProtocolIATP = 117 // Interactive Agent Transfer Protocol ianaProtocolSTP = 118 // Schedule Transfer Protocol ianaProtocolSRP = 119 // SpectraLink Radio Protocol ianaProtocolUTI = 120 // UTI ianaProtocolSMP = 121 // Simple Message Protocol ianaProtocolSM = 122 // SM ianaProtocolPTP = 123 // Performance Transparency Protocol ianaProtocolISIS = 124 // ISIS over IPv4 ianaProtocolFIRE = 125 // FIRE ianaProtocolCRTP = 126 // Combat Radio Transport Protocol ianaProtocolCRUDP = 127 // Combat Radio User Datagram ianaProtocolSSCOPMCE = 128 // SSCOPMCE ianaProtocolIPLT = 129 // IPLT ianaProtocolSPS = 130 // Secure Packet Shield ianaProtocolPIPE = 131 // Private IP Encapsulation within IP ianaProtocolSCTP = 132 // Stream Control Transmission Protocol ianaProtocolFC = 133 // Fibre Channel ianaProtocolRSVPE2EIGNORE = 134 // RSVP-E2E-IGNORE ianaProtocolMobilityHeader = 135 // Mobility Header ianaProtocolUDPLite = 136 // UDPLite ianaProtocolMPLSinIP = 137 // MPLS-in-IP ianaProtocolMANET = 138 // MANET Protocols ianaProtocolHIP = 139 // Host Identity Protocol ianaProtocolShim6 = 140 // Shim6 Protocol ianaProtocolWESP = 141 // Wrapped Encapsulating Security Payload ianaProtocolROHC = 142 // Robust Header Compression ianaProtocolReserved = 255 // Reserved ) go.net/ipv4/control.go0000644000175100017510000000321512235217213014214 0ustar spirospiro// 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. package ipv4 import ( "fmt" "net" "sync" ) type rawOpt struct { sync.Mutex cflags ControlFlags } func (c *rawOpt) set(f ControlFlags) { c.cflags |= f } func (c *rawOpt) clear(f ControlFlags) { c.cflags &^= f } func (c *rawOpt) isset(f ControlFlags) bool { return c.cflags&f != 0 } type ControlFlags uint const ( FlagTTL ControlFlags = 1 << iota // pass the TTL on the received packet FlagSrc // pass the source address on the received packet FlagDst // pass the destination address on the received packet FlagInterface // pass the interface index on the received packet ) // A ControlMessage represents per packet basis IP-level socket options. type ControlMessage struct { // Receiving socket options: SetControlMessage allows to // receive the options from the protocol stack using ReadFrom // method of PacketConn or RawConn. // // Specifying socket options: ControlMessage for WriteTo // method of PacketConn or RawConn allows to send the options // to the protocol stack. // TTL int // time-to-live, receiving only Src net.IP // source address, specifying only Dst net.IP // destination address, receiving only IfIndex int // interface index, must be 1 <= value when specifying } func (cm *ControlMessage) String() string { if cm == nil { return "" } return fmt.Sprintf("ttl: %v, src: %v, dst: %v, ifindex: %v", cm.TTL, cm.Src, cm.Dst, cm.IfIndex) } go.net/ipv4/multicast_test.go0000644000175100017510000001141312235217213015577 0ustar spirospiro// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin freebsd linux netbsd openbsd package ipv4_test import ( "code.google.com/p/go.net/ipv4" "net" "os" "testing" ) func TestReadWriteMulticastIPPayloadUDP(t *testing.T) { if testing.Short() || !*testExternal { t.Skip("to avoid external network") } c, err := net.ListenPacket("udp4", "224.0.0.0:1024") // see RFC 4727 if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() ifi := loopbackInterface() if ifi == nil { t.Skip("an appropriate interface not found") } dst, err := net.ResolveUDPAddr("udp4", "224.0.0.254:1024") // see RFC 4727 if err != nil { t.Fatalf("net.ResolveUDPAddr failed: %v", err) } p := ipv4.NewPacketConn(c) if err := p.JoinGroup(ifi, dst); err != nil { t.Fatalf("ipv4.PacketConn.JoinGroup on %v failed: %v", ifi, err) } if err := p.SetMulticastInterface(ifi); err != nil { t.Fatalf("ipv4.PacketConn.SetMulticastInterface failed: %v", err) } if err := p.SetMulticastLoopback(true); err != nil { t.Fatalf("ipv4.PacketConn.SetMulticastLoopback failed: %v", err) } cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface for i, toggle := range []bool{true, false, true} { if err := p.SetControlMessage(cf, toggle); err != nil { t.Fatalf("ipv4.PacketConn.SetControlMessage failed: %v", err) } writeThenReadPayload(t, i, p, []byte("HELLO-R-U-THERE"), dst) } } func TestReadWriteMulticastIPPayloadICMP(t *testing.T) { if testing.Short() || !*testExternal { t.Skip("to avoid external network") } if os.Getuid() != 0 { t.Skip("must be root") } c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() ifi := loopbackInterface() if ifi == nil { t.Skip("an appropriate interface not found") } dst, err := net.ResolveIPAddr("ip4", "224.0.0.254") // see RFC 4727 if err != nil { t.Fatalf("net.ResolveIPAddr failed: %v", err) } p := ipv4.NewPacketConn(c) if err := p.JoinGroup(ifi, dst); err != nil { t.Fatalf("ipv4.PacketConn.JoinGroup on %v failed: %v", ifi, err) } if err := p.SetMulticastInterface(ifi); err != nil { t.Fatalf("ipv4.PacketConn.SetMulticastInterface failed: %v", err) } cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface for i, toggle := range []bool{true, false, true} { wb, err := (&icmpMessage{ Type: ipv4.ICMPTypeEcho, Code: 0, Body: &icmpEcho{ ID: os.Getpid() & 0xffff, Seq: i + 1, Data: []byte("HELLO-R-U-THERE"), }, }).Marshal() if err != nil { t.Fatalf("icmpMessage.Marshal failed: %v", err) } if err := p.SetControlMessage(cf, toggle); err != nil { t.Fatalf("ipv4.PacketConn.SetControlMessage failed: %v", err) } rb := writeThenReadPayload(t, i, p, wb, dst) m, err := parseICMPMessage(rb) if err != nil { t.Fatalf("parseICMPMessage failed: %v", err) } if m.Type != ipv4.ICMPTypeEchoReply || m.Code != 0 { t.Fatalf("got type=%v, code=%v; expected type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) } } } func TestReadWriteMulticastIPDatagram(t *testing.T) { if testing.Short() || !*testExternal { t.Skip("to avoid external network") } if os.Getuid() != 0 { t.Skip("must be root") } c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() ifi := loopbackInterface() if ifi == nil { t.Skip("an appropriate interface not found") } dst, err := net.ResolveIPAddr("ip4", "224.0.0.254") // see RFC 4727 if err != nil { t.Fatalf("ResolveIPAddr failed: %v", err) } r, err := ipv4.NewRawConn(c) if err != nil { t.Fatalf("ipv4.NewRawConn failed: %v", err) } if err := r.JoinGroup(ifi, dst); err != nil { t.Fatalf("ipv4.RawConn.JoinGroup on %v failed: %v", ifi, err) } if err := r.SetMulticastInterface(ifi); err != nil { t.Fatalf("ipv4.PacketConn.SetMulticastInterface failed: %v", err) } cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface for i, toggle := range []bool{true, false, true} { wb, err := (&icmpMessage{ Type: ipv4.ICMPTypeEcho, Code: 0, Body: &icmpEcho{ ID: os.Getpid() & 0xffff, Seq: i + 1, Data: []byte("HELLO-R-U-THERE"), }, }).Marshal() if err != nil { t.Fatalf("icmpMessage.Marshal failed: %v", err) } if err := r.SetControlMessage(cf, toggle); err != nil { t.Fatalf("ipv4.RawConn.SetControlMessage failed: %v", err) } rb := writeThenReadDatagram(t, i, r, wb, nil, dst) m, err := parseICMPMessage(rb) if err != nil { t.Fatalf("parseICMPMessage failed: %v", err) } if m.Type != ipv4.ICMPTypeEchoReply || m.Code != 0 { t.Fatalf("got type=%v, code=%v; expected type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) } } } go.net/ipv4/dgramopt_plan9.go0000644000175100017510000000222612235217213015455 0ustar spirospiro// 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. package ipv4 import ( "net" "syscall" ) func (c *dgramOpt) MulticastTTL() (int, error) { // TODO(mikio): Implement this return 0, syscall.EPLAN9 } func (c *dgramOpt) SetMulticastTTL(ttl int) error { // TODO(mikio): Implement this return syscall.EPLAN9 } func (c *dgramOpt) MulticastInterface() (*net.Interface, error) { // TODO(mikio): Implement this return nil, syscall.EPLAN9 } func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error { // TODO(mikio): Implement this return syscall.EPLAN9 } func (c *dgramOpt) MulticastLoopback() (bool, error) { // TODO(mikio): Implement this return false, syscall.EPLAN9 } func (c *dgramOpt) SetMulticastLoopback(on bool) error { // TODO(mikio): Implement this return syscall.EPLAN9 } func (c *dgramOpt) JoinGroup(ifi *net.Interface, grp net.Addr) error { // TODO(mikio): Implement this return syscall.EPLAN9 } func (c *dgramOpt) LeaveGroup(ifi *net.Interface, grp net.Addr) error { // TODO(mikio): Implement this return syscall.EPLAN9 } go.net/ipv4/control_linux.go0000644000175100017510000000563412235217213015442 0ustar spirospiro// 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. package ipv4 import ( "os" "syscall" "unsafe" ) // Linux provides a convenient path control option IP_PKTINFO that // contains IP_SENDSRCADDR, IP_RECVDSTADDR, IP_RECVIF and IP_SENDIF. const pktinfo = FlagSrc | FlagDst | FlagInterface func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error { opt.Lock() defer opt.Unlock() if cf&FlagTTL != 0 { if err := setIPv4ReceiveTTL(fd, on); err != nil { return err } if on { opt.set(FlagTTL) } else { opt.clear(FlagTTL) } } if cf&pktinfo != 0 { if err := setIPv4PacketInfo(fd, on); err != nil { return err } if on { opt.set(cf & pktinfo) } else { opt.clear(cf & pktinfo) } } return nil } func newControlMessage(opt *rawOpt) (oob []byte) { opt.Lock() defer opt.Unlock() l, off := 0, 0 if opt.isset(FlagTTL) { l += syscall.CmsgSpace(1) } if opt.isset(pktinfo) { l += syscall.CmsgSpace(syscall.SizeofInet4Pktinfo) } if l > 0 { oob = make([]byte, l) if opt.isset(FlagTTL) { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIP m.Type = syscall.IP_RECVTTL m.SetLen(syscall.CmsgLen(1)) off += syscall.CmsgSpace(1) } if opt.isset(pktinfo) { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIP m.Type = syscall.IP_PKTINFO m.SetLen(syscall.CmsgLen(syscall.SizeofInet4Pktinfo)) off += syscall.CmsgSpace(syscall.SizeofInet4Pktinfo) } } return } func parseControlMessage(b []byte) (*ControlMessage, error) { if len(b) == 0 { return nil, nil } cmsgs, err := syscall.ParseSocketControlMessage(b) if err != nil { return nil, os.NewSyscallError("parse socket control message", err) } cm := &ControlMessage{} for _, m := range cmsgs { if m.Header.Level != ianaProtocolIP { continue } switch m.Header.Type { case syscall.IP_TTL: cm.TTL = int(*(*byte)(unsafe.Pointer(&m.Data[:1][0]))) case syscall.IP_PKTINFO: pi := (*syscall.Inet4Pktinfo)(unsafe.Pointer(&m.Data[0])) cm.IfIndex = int(pi.Ifindex) cm.Dst = pi.Addr[:] } } return cm, nil } func marshalControlMessage(cm *ControlMessage) (oob []byte) { if cm == nil { return } l, off := 0, 0 pion := false if cm.Src.To4() != nil || cm.IfIndex != 0 { pion = true l += syscall.CmsgSpace(syscall.SizeofInet4Pktinfo) } if l > 0 { oob = make([]byte, l) if pion { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIP m.Type = syscall.IP_PKTINFO m.SetLen(syscall.CmsgLen(syscall.SizeofInet4Pktinfo)) pi := (*syscall.Inet4Pktinfo)(unsafe.Pointer(&oob[off+syscall.CmsgLen(0)])) if ip := cm.Src.To4(); ip != nil { copy(pi.Addr[:], ip) } if cm.IfIndex != 0 { pi.Ifindex = int32(cm.IfIndex) } off += syscall.CmsgSpace(syscall.SizeofInet4Pktinfo) } } return } go.net/ipv4/sockopt_freebsd.go0000644000175100017510000000113512235217213015707 0ustar spirospiro// 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. package ipv4 import ( "os" "syscall" ) func ipv4SendSourceAddress(fd int) (bool, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_SENDSRCADDR) if err != nil { return false, os.NewSyscallError("getsockopt", err) } return v == 1, nil } func setIPv4SendSourceAddress(fd int, v bool) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_SENDSRCADDR, boolint(v))) } go.net/ipv4/multicastsockopt_test.go0000644000175100017510000000674412235217213017215 0ustar spirospiro// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin freebsd linux netbsd openbsd windows package ipv4_test import ( "code.google.com/p/go.net/ipv4" "net" "os" "runtime" "testing" ) type testMulticastConn interface { testUnicastConn MulticastTTL() (int, error) SetMulticastTTL(ttl int) error MulticastLoopback() (bool, error) SetMulticastLoopback(bool) error JoinGroup(*net.Interface, net.Addr) error LeaveGroup(*net.Interface, net.Addr) error } type multicastSockoptTest struct { tos int ttl int mcttl int mcloop bool gaddr net.IP } var multicastSockoptTests = []multicastSockoptTest{ {DiffServCS0 | NotECNTransport, 127, 128, false, net.IPv4(224, 0, 0, 249)}, // see RFC 4727 {DiffServAF11 | NotECNTransport, 255, 254, true, net.IPv4(224, 0, 0, 250)}, // see RFC 4727 } func TestUDPMulticastSockopt(t *testing.T) { if testing.Short() || !*testExternal { t.Skip("to avoid external network") } for _, tt := range multicastSockoptTests { c, err := net.ListenPacket("udp4", "0.0.0.0:0") if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() p := ipv4.NewPacketConn(c) testMulticastSockopt(t, tt, p, &net.UDPAddr{IP: tt.gaddr}) } } func TestIPMulticastSockopt(t *testing.T) { if testing.Short() || !*testExternal { t.Skip("to avoid external network") } if os.Getuid() != 0 { t.Skip("must be root") } for _, tt := range multicastSockoptTests { c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() r, _ := ipv4.NewRawConn(c) testMulticastSockopt(t, tt, r, &net.IPAddr{IP: tt.gaddr}) } } func testMulticastSockopt(t *testing.T, tt multicastSockoptTest, c testMulticastConn, gaddr net.Addr) { switch runtime.GOOS { case "windows": // IP_TOS option is supported on Windows 8 and beyond. t.Logf("skipping IP_TOS test on %q", runtime.GOOS) default: if err := c.SetTOS(tt.tos); err != nil { t.Fatalf("ipv4.PacketConn.SetTOS failed: %v", err) } if v, err := c.TOS(); err != nil { t.Fatalf("ipv4.PacketConn.TOS failed: %v", err) } else if v != tt.tos { t.Fatalf("Got unexpected TOS value %v; expected %v", v, tt.tos) } } if err := c.SetTTL(tt.ttl); err != nil { t.Fatalf("ipv4.PacketConn.SetTTL failed: %v", err) } if v, err := c.TTL(); err != nil { t.Fatalf("ipv4.PacketConn.TTL failed: %v", err) } else if v != tt.ttl { t.Fatalf("Got unexpected TTL value %v; expected %v", v, tt.ttl) } if err := c.SetMulticastTTL(tt.mcttl); err != nil { t.Fatalf("ipv4.PacketConn.SetMulticastTTL failed: %v", err) } if v, err := c.MulticastTTL(); err != nil { t.Fatalf("ipv4.PacketConn.MulticastTTL failed: %v", err) } else if v != tt.mcttl { t.Fatalf("Got unexpected MulticastTTL value %v; expected %v", v, tt.mcttl) } if err := c.SetMulticastLoopback(tt.mcloop); err != nil { t.Fatalf("ipv4.PacketConn.SetMulticastLoopback failed: %v", err) } if v, err := c.MulticastLoopback(); err != nil { t.Fatalf("ipv4.PacketConn.MulticastLoopback failed: %v", err) } else if v != tt.mcloop { t.Fatalf("Got unexpected MulticastLoopback value %v; expected %v", v, tt.mcloop) } if err := c.JoinGroup(nil, gaddr); err != nil { t.Fatalf("ipv4.PacketConn.JoinGroup(%v) failed: %v", gaddr, err) } if err := c.LeaveGroup(nil, gaddr); err != nil { t.Fatalf("ipv4.PacketConn.LeaveGroup(%v) failed: %v", gaddr, err) } } go.net/ipv4/mocktransponder_test.go0000644000175100017510000000571612235217213017014 0ustar spirospiro// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin freebsd linux netbsd openbsd package ipv4_test import ( "code.google.com/p/go.net/ipv4" "net" "testing" "time" ) // writeThenReadPayload transmits IPv4 datagram payloads to the // loopback address or interface and captures the loopback'd datagram // payloads. func writeThenReadPayload(t *testing.T, i int, c *ipv4.PacketConn, wb []byte, dst net.Addr) []byte { rb := make([]byte, 1500) c.SetTOS(i + 1) var ip net.IP switch v := dst.(type) { case *net.UDPAddr: ip = v.IP case *net.IPAddr: ip = v.IP } if ip.IsMulticast() { c.SetMulticastTTL(i + 1) } else { c.SetTTL(i + 1) } c.SetDeadline(time.Now().Add(100 * time.Millisecond)) if _, err := c.WriteTo(wb, nil, dst); err != nil { t.Fatalf("ipv4.PacketConn.WriteTo failed: %v", err) } n, cm, _, err := c.ReadFrom(rb) if err != nil { t.Fatalf("ipv4.PacketConn.ReadFrom failed: %v", err) } t.Logf("rcvd cmsg: %v", cm) return rb[:n] } // writeThenReadDatagram transmits ICMP for IPv4 datagrams to the // loopback address or interface and captures the response datagrams // from the protocol stack within the kernel. func writeThenReadDatagram(t *testing.T, i int, c *ipv4.RawConn, wb []byte, src, dst net.Addr) []byte { rb := make([]byte, ipv4.HeaderLen+len(wb)) wh := &ipv4.Header{ Version: ipv4.Version, Len: ipv4.HeaderLen, TOS: i + 1, TotalLen: ipv4.HeaderLen + len(wb), TTL: i + 1, Protocol: 1, } if src != nil { wh.Src = src.(*net.IPAddr).IP } if dst != nil { wh.Dst = dst.(*net.IPAddr).IP } c.SetDeadline(time.Now().Add(100 * time.Millisecond)) if err := c.WriteTo(wh, wb, nil); err != nil { t.Fatalf("ipv4.RawConn.WriteTo failed: %v", err) } rh, b, cm, err := c.ReadFrom(rb) if err != nil { t.Fatalf("ipv4.RawConn.ReadFrom failed: %v", err) } t.Logf("rcvd cmsg: %v", cm.String()) t.Logf("rcvd hdr: %v", rh.String()) return b } // LoopbackInterface returns a logical network interface for loopback // tests. func loopbackInterface() *net.Interface { ift, err := net.Interfaces() if err != nil { return nil } for _, ifi := range ift { if ifi.Flags&net.FlagLoopback != 0 { return &ifi } } return nil } // isMulticastAvailable returns true if ifi is a multicast access // enabled network interface. It also returns a unicast IPv4 address // that can be used for listening on ifi. func isMulticastAvailable(ifi *net.Interface) (net.IP, bool) { if ifi.Flags&net.FlagUp == 0 || ifi.Flags&net.FlagMulticast == 0 { return nil, false } ifat, err := ifi.Addrs() if err != nil { return nil, false } if len(ifat) == 0 { return nil, false } var ip net.IP for _, ifa := range ifat { switch v := ifa.(type) { case *net.IPAddr: ip = v.IP case *net.IPNet: ip = v.IP default: continue } if ip.To4() == nil { ip = nil continue } break } return ip, true } go.net/ipv4/gen.go0000644000175100017510000001276512235217213013317 0ustar spirospiro// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build ignore // This program generates internet protocol constatns and tables by // reading IANA protocol registries. // // Usage of this program: // go run gen.go > iana.go package main import ( "bytes" "encoding/xml" "fmt" "go/format" "io" "net/http" "os" "strconv" "strings" ) var registries = []struct { url string parse func(io.Writer, io.Reader) error }{ { "http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xml", parseICMPv4Parameters, }, { "http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml", parseProtocolNumbers, }, } func main() { var bb bytes.Buffer fmt.Fprintf(&bb, "// go run gen.go\n") fmt.Fprintf(&bb, "// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n") fmt.Fprintf(&bb, "package ipv4\n\n") for _, r := range registries { resp, err := http.Get(r.url) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { fmt.Fprintf(os.Stderr, "got HTTP status code %v for %v\n", resp.StatusCode, r.url) os.Exit(1) } if err := r.parse(&bb, resp.Body); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } fmt.Fprintf(&bb, "\n") } b, err := format.Source(bb.Bytes()) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } os.Stdout.Write(b) } func parseICMPv4Parameters(w io.Writer, r io.Reader) error { dec := xml.NewDecoder(r) var icp icmpv4Parameters if err := dec.Decode(&icp); err != nil { return err } prs := icp.escape() fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) fmt.Fprintf(w, "const (\n") for _, pr := range prs { if pr.Descr == "" { continue } fmt.Fprintf(w, "ICMPType%s ICMPType = %d", pr.Descr, pr.Value) fmt.Fprintf(w, "// %s\n", pr.OrigDescr) } fmt.Fprintf(w, ")\n\n") fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) fmt.Fprintf(w, "var icmpTypes = map[ICMPType]string{\n") for _, pr := range prs { if pr.Descr == "" { continue } fmt.Fprintf(w, "%d: %q,\n", pr.Value, strings.ToLower(pr.OrigDescr)) } fmt.Fprintf(w, "}\n") return nil } type icmpv4Parameters struct { XMLName xml.Name `xml:"registry"` Title string `xml:"title"` Updated string `xml:"updated"` Registries []struct { Title string `xml:"title"` Records []struct { Value string `xml:"value"` Descr string `xml:"description"` } `xml:"record"` } `xml:"registry"` } type canonICMPv4ParamRecord struct { OrigDescr string Descr string Value int } func (icp *icmpv4Parameters) escape() []canonICMPv4ParamRecord { id := -1 for i, r := range icp.Registries { if strings.Contains(r.Title, "Type") || strings.Contains(r.Title, "type") { id = i break } } if id < 0 { return nil } prs := make([]canonICMPv4ParamRecord, len(icp.Registries[id].Records)) sr := strings.NewReplacer( "Messages", "", "Message", "", "ICMP", "", "+", "P", "-", "", "/", "", ".", "", " ", "", ) for i, pr := range icp.Registries[id].Records { if strings.Contains(pr.Descr, "Reserved") || strings.Contains(pr.Descr, "Unassigned") || strings.Contains(pr.Descr, "Deprecated") || strings.Contains(pr.Descr, "Experiment") || strings.Contains(pr.Descr, "experiment") { continue } ss := strings.Split(pr.Descr, "\n") if len(ss) > 1 { prs[i].Descr = strings.Join(ss, " ") } else { prs[i].Descr = ss[0] } s := strings.TrimSpace(prs[i].Descr) prs[i].OrigDescr = s prs[i].Descr = sr.Replace(s) prs[i].Value, _ = strconv.Atoi(pr.Value) } return prs } func parseProtocolNumbers(w io.Writer, r io.Reader) error { dec := xml.NewDecoder(r) var pn protocolNumbers if err := dec.Decode(&pn); err != nil { return err } prs := pn.escape() prs = append([]canonProtocolRecord{{ Name: "IP", Descr: "IPv4 encapsulation, pseudo protocol number", Value: 0, }}, prs...) fmt.Fprintf(w, "// %s, Updated: %s\n", pn.Title, pn.Updated) fmt.Fprintf(w, "const (\n") for _, pr := range prs { if pr.Name == "" { continue } fmt.Fprintf(w, "ianaProtocol%s = %d", pr.Name, pr.Value) s := pr.Descr if s == "" { s = pr.OrigName } fmt.Fprintf(w, "// %s\n", s) } fmt.Fprintf(w, ")\n") return nil } type protocolNumbers struct { XMLName xml.Name `xml:"registry"` Title string `xml:"title"` Updated string `xml:"updated"` RegTitle string `xml:"registry>title"` Note string `xml:"registry>note"` Records []struct { Value string `xml:"value"` Name string `xml:"name"` Descr string `xml:"description"` } `xml:"registry>record"` } type canonProtocolRecord struct { OrigName string Name string Descr string Value int } func (pn *protocolNumbers) escape() []canonProtocolRecord { prs := make([]canonProtocolRecord, len(pn.Records)) sr := strings.NewReplacer( "-in-", "in", "-within-", "within", "-over-", "over", "+", "P", "-", "", "/", "", ".", "", " ", "", ) for i, pr := range pn.Records { prs[i].OrigName = pr.Name s := strings.TrimSpace(pr.Name) switch pr.Name { case "ISIS over IPv4": prs[i].Name = "ISIS" case "manet": prs[i].Name = "MANET" default: prs[i].Name = sr.Replace(s) } ss := strings.Split(pr.Descr, "\n") for i := range ss { ss[i] = strings.TrimSpace(ss[i]) } if len(ss) > 1 { prs[i].Descr = strings.Join(ss, " ") } else { prs[i].Descr = ss[0] } prs[i].Value, _ = strconv.Atoi(pr.Value) } return prs } go.net/ipv4/control_windows.go0000644000175100017510000000122712235217213015767 0ustar spirospiro// 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. package ipv4 import "syscall" func setControlMessage(fd syscall.Handle, opt *rawOpt, cf ControlFlags, on bool) error { // TODO(mikio): Implement this return syscall.EWINDOWS } func newControlMessage(opt *rawOpt) []byte { // TODO(mikio): Implement this return nil } func parseControlMessage(b []byte) (*ControlMessage, error) { // TODO(mikio): Implement this return nil, syscall.EWINDOWS } func marshalControlMessage(cm *ControlMessage) []byte { // TODO(mikio): Implement this return nil } go.net/ipv4/endpoint.go0000644000175100017510000001111412235217213014351 0ustar spirospiro// 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. package ipv4 import ( "net" "syscall" "time" ) // A Conn represents a network endpoint that uses the IPv4 transport. // It is used to control basic IP-level socket options such as TOS and // TTL. type Conn struct { genericOpt } type genericOpt struct { net.Conn } func (c *genericOpt) ok() bool { return c != nil && c.Conn != nil } // NewConn returns a new Conn. func NewConn(c net.Conn) *Conn { return &Conn{ genericOpt: genericOpt{Conn: c}, } } // 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 // network I/O methods specific to the IPv4 and higher layer protocols // such as UDP. type PacketConn struct { genericOpt dgramOpt payloadHandler } type dgramOpt struct { net.PacketConn } func (c *dgramOpt) ok() bool { return c != nil && c.PacketConn != nil } // SetControlMessage sets the per packet IP-level socket options. func (c *PacketConn) SetControlMessage(cf ControlFlags, on bool) error { if !c.payloadHandler.ok() { return syscall.EINVAL } fd, err := c.payloadHandler.sysfd() if err != nil { return err } return setControlMessage(fd, &c.payloadHandler.rawOpt, cf, on) } // SetDeadline sets the read and write deadlines associated with the // endpoint. func (c *PacketConn) SetDeadline(t time.Time) error { if !c.payloadHandler.ok() { return syscall.EINVAL } return c.payloadHandler.PacketConn.SetDeadline(t) } // SetReadDeadline sets the read deadline associated with the // endpoint. func (c *PacketConn) SetReadDeadline(t time.Time) error { if !c.payloadHandler.ok() { return syscall.EINVAL } return c.payloadHandler.PacketConn.SetReadDeadline(t) } // SetWriteDeadline sets the write deadline associated with the // endpoint. func (c *PacketConn) SetWriteDeadline(t time.Time) error { if !c.payloadHandler.ok() { return syscall.EINVAL } return c.payloadHandler.PacketConn.SetWriteDeadline(t) } // Close closes the endpoint. func (c *PacketConn) Close() error { if !c.payloadHandler.ok() { return syscall.EINVAL } return c.payloadHandler.PacketConn.Close() } // NewPacketConn returns a new PacketConn using c as its underlying // transport. func NewPacketConn(c net.PacketConn) *PacketConn { return &PacketConn{ genericOpt: genericOpt{Conn: c.(net.Conn)}, dgramOpt: dgramOpt{PacketConn: c}, payloadHandler: payloadHandler{PacketConn: c}, } } // 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 // 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 { genericOpt dgramOpt packetHandler } // SetControlMessage sets the per packet IP-level socket options. func (c *RawConn) SetControlMessage(cf ControlFlags, on bool) error { if !c.packetHandler.ok() { return syscall.EINVAL } fd, err := c.packetHandler.sysfd() if err != nil { return err } return setControlMessage(fd, &c.packetHandler.rawOpt, cf, on) } // SetDeadline sets the read and write deadlines associated with the // endpoint. func (c *RawConn) SetDeadline(t time.Time) error { if !c.packetHandler.ok() { return syscall.EINVAL } return c.packetHandler.c.SetDeadline(t) } // SetReadDeadline sets the read deadline associated with the // endpoint. func (c *RawConn) SetReadDeadline(t time.Time) error { if !c.packetHandler.ok() { return syscall.EINVAL } return c.packetHandler.c.SetReadDeadline(t) } // SetWriteDeadline sets the write deadline associated with the // endpoint. func (c *RawConn) SetWriteDeadline(t time.Time) error { if !c.packetHandler.ok() { return syscall.EINVAL } return c.packetHandler.c.SetWriteDeadline(t) } // Close closes the endpoint. func (c *RawConn) Close() error { if !c.packetHandler.ok() { return syscall.EINVAL } return c.packetHandler.c.Close() } // NewRawConn returns a new RawConn using c as its underlying // transport. func NewRawConn(c net.PacketConn) (*RawConn, error) { r := &RawConn{ genericOpt: genericOpt{Conn: c.(net.Conn)}, dgramOpt: dgramOpt{PacketConn: c}, packetHandler: packetHandler{c: c.(*net.IPConn)}, } fd, err := r.packetHandler.sysfd() if err != nil { return nil, err } if err := setIPv4HeaderPrepend(fd, true); err != nil { return nil, err } return r, nil } go.net/ipv4/helper_windows.go0000644000175100017510000000224712235217213015571 0ustar spirospiro// 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. package ipv4 import ( "net" "reflect" "syscall" ) func (c *genericOpt) sysfd() (syscall.Handle, error) { switch p := c.Conn.(type) { case *net.TCPConn, *net.UDPConn, *net.IPConn: return sysfd(p) } return syscall.InvalidHandle, errInvalidConnType } func (c *dgramOpt) sysfd() (syscall.Handle, error) { switch p := c.PacketConn.(type) { case *net.UDPConn, *net.IPConn: return sysfd(p.(net.Conn)) } return syscall.InvalidHandle, errInvalidConnType } func (c *payloadHandler) sysfd() (syscall.Handle, error) { return sysfd(c.PacketConn.(net.Conn)) } func (c *packetHandler) sysfd() (syscall.Handle, error) { return sysfd(c.c) } func sysfd(c net.Conn) (syscall.Handle, error) { cv := reflect.ValueOf(c) switch ce := cv.Elem(); ce.Kind() { case reflect.Struct: netfd := ce.FieldByName("conn").FieldByName("fd") switch fe := netfd.Elem(); fe.Kind() { case reflect.Struct: fd := fe.FieldByName("sysfd") return syscall.Handle(fd.Uint()), nil } } return syscall.InvalidHandle, errInvalidConnType } go.net/ipv4/packet.go0000644000175100017510000000530112235217213014001 0ustar spirospiro// 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. package ipv4 import ( "net" "syscall" ) // A packetHandler represents the IPv4 datagram handler. type packetHandler struct { c *net.IPConn rawOpt } 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 // 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() { return nil, nil, nil, syscall.EINVAL } oob := newControlMessage(&c.rawOpt) n, oobn, _, src, err := c.c.ReadMsgIP(b, oob) if err != nil { return nil, nil, nil, err } var hs []byte if hs, p, err = slicePacket(b[:n]); err != nil { return nil, nil, nil, err } if h, err = ParseHeader(hs); err != nil { return nil, nil, nil, err } if cm, err = parseControlMessage(oob[:oobn]); err != nil { return nil, nil, nil, err } if src != nil && cm != nil { cm.Src = src.IP } return } func slicePacket(b []byte) (h, p []byte, err error) { if len(b) < HeaderLen { return nil, nil, errHeaderTooShort } hdrlen := int(b[0]&0x0f) << 2 return b[:hdrlen], b[hdrlen:], nil } // WriteTo writes an IPv4 datagram through the endpoint c, copying the // 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 Linux supports 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: // // Version = ipv4.Version // Len = // TOS = // TotalLen = // ID = platform sets an appropriate value if ID is zero // FragOff = // TTL = // Protocol = // Checksum = platform sets an appropriate value if Checksum is zero // Src = platform sets an appropriate value if Src is nil // Dst = // h.Options = optional func (c *packetHandler) WriteTo(h *Header, p []byte, cm *ControlMessage) error { if !c.ok() { return syscall.EINVAL } oob := marshalControlMessage(cm) wh, err := h.Marshal() if err != nil { return err } dst := &net.IPAddr{} if cm != nil { if ip := cm.Dst.To4(); ip != nil { dst.IP = ip } } if dst.IP == nil { dst.IP = h.Dst } wh = append(wh, p...) _, _, err = c.c.WriteMsgIP(wh, oob, dst) return err } go.net/ipv4/icmp.go0000644000175100017510000000053512235217213013466 0ustar spirospiro// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv4 // An ICMPType represents a type of ICMP message. type ICMPType int func (typ ICMPType) String() string { s, ok := icmpTypes[typ] if !ok { return "" } return s } go.net/ipv4/iana_test.go0000644000175100017510000000237712235217213014513 0ustar spirospiro// go run gentest.go // GENERATED BY THE COMMAND ABOVE; DO NOT EDIT package ipv4_test // Differentiated Services Field Codepoints (DSCP), Updated: 2013-06-25 const ( DiffServCS0 = 0x0 // CS0 DiffServCS1 = 0x20 // CS1 DiffServCS2 = 0x40 // CS2 DiffServCS3 = 0x60 // CS3 DiffServCS4 = 0x80 // CS4 DiffServCS5 = 0xa0 // CS5 DiffServCS6 = 0xc0 // CS6 DiffServCS7 = 0xe0 // CS7 DiffServAF11 = 0x28 // AF11 DiffServAF12 = 0x30 // AF12 DiffServAF13 = 0x38 // AF13 DiffServAF21 = 0x48 // AF21 DiffServAF22 = 0x50 // AF22 DiffServAF23 = 0x58 // AF23 DiffServAF31 = 0x68 // AF31 DiffServAF32 = 0x70 // AF32 DiffServAF33 = 0x78 // AF33 DiffServAF41 = 0x88 // AF41 DiffServAF42 = 0x90 // AF42 DiffServAF43 = 0x98 // AF43 DiffServEFPHB = 0xb8 // EF PHB DiffServVOICEADMIT = 0xb0 // VOICE-ADMIT ) // IPv4 TOS Byte and IPv6 Traffic Class Octet, Updated: 2001-09-06 const ( NotECNTransport = 0x0 // Not-ECT (Not ECN-Capable Transport) ECNTransport1 = 0x1 // ECT(1) (ECN-Capable Transport(1)) ECNTransport0 = 0x2 // ECT(0) (ECN-Capable Transport(0)) CongestionExperienced = 0x3 // CE (Congestion Experienced) ) go.net/ipv4/genericopt_plan9.go0000644000175100017510000000114112235217213015772 0ustar spirospiro// 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. package ipv4 import ( "syscall" ) func (c *genericOpt) TOS() (int, error) { // TODO(mikio): Implement this return 0, syscall.EPLAN9 } func (c *genericOpt) SetTOS(tos int) error { // TODO(mikio): Implement this return syscall.EPLAN9 } func (c *genericOpt) TTL() (int, error) { // TODO(mikio): Implement this return 0, syscall.EPLAN9 } func (c *genericOpt) SetTTL(ttl int) error { // TODO(mikio): Implement this return syscall.EPLAN9 } go.net/ipv4/header.go0000644000175100017510000001165212235217213013770 0ustar spirospiro// 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. package ipv4 import ( "errors" "fmt" "net" "runtime" "syscall" "unsafe" ) var ( errMissingAddress = errors.New("missing address") errMissingHeader = errors.New("missing header") errHeaderTooShort = errors.New("header too short") errBufferTooShort = errors.New("buffer too short") errInvalidConnType = errors.New("invalid conn type") ) // References: // // RFC 791 Internet Protocol // http://tools.ietf.org/html/rfc791 // RFC 1112 Host Extensions for IP Multicasting // http://tools.ietf.org/html/rfc1112 // RFC 1122 Requirements for Internet Hosts // http://tools.ietf.org/html/rfc1122 const ( Version = 4 // protocol version HeaderLen = 20 // header length without extension headers maxHeaderLen = 60 // sensible default, revisit if later RFCs define new usage of version and header length fields ) const ( posTOS = 1 // type-of-service posTotalLen = 2 // packet total length posID = 4 // identification posFragOff = 6 // fragment offset posTTL = 8 // time-to-live posProtocol = 9 // next protocol posChecksum = 10 // checksum posSrc = 12 // source address posDst = 16 // destination address ) type HeaderFlags int const ( MoreFragments HeaderFlags = 1 << iota // more fragments flag DontFragment // don't fragment flag ) // A Header represents an IPv4 header. type Header struct { Version int // protocol version Len int // header length TOS int // type-of-service TotalLen int // packet total length ID int // identification Flags HeaderFlags // flags FragOff int // fragment offset TTL int // time-to-live Protocol int // next protocol Checksum int // checksum Src net.IP // source address Dst net.IP // destination address Options []byte // options, extension headers } func (h *Header) String() string { if h == nil { return "" } return fmt.Sprintf("ver: %v, hdrlen: %v, tos: %#x, totallen: %v, id: %#x, flags: %#x, fragoff: %#x, ttl: %v, proto: %v, cksum: %#x, src: %v, dst: %v", h.Version, h.Len, h.TOS, h.TotalLen, h.ID, h.Flags, h.FragOff, h.TTL, h.Protocol, h.Checksum, h.Src, h.Dst) } // Please refer to the online manual; IP(4) on Darwin, FreeBSD and // OpenBSD. IP(7) on Linux. const supportsNewIPInput = runtime.GOOS == "linux" || runtime.GOOS == "openbsd" // Marshal returns the binary encoding of the IPv4 header h. func (h *Header) Marshal() ([]byte, error) { if h == nil { return nil, syscall.EINVAL } if h.Len < HeaderLen { return nil, errHeaderTooShort } hdrlen := HeaderLen + len(h.Options) b := make([]byte, hdrlen) b[0] = byte(Version<<4 | (hdrlen >> 2 & 0x0f)) b[posTOS] = byte(h.TOS) flagsAndFragOff := (h.FragOff & 0x1fff) | int(h.Flags<<13) if supportsNewIPInput { b[posTotalLen], b[posTotalLen+1] = byte(h.TotalLen>>8), byte(h.TotalLen) b[posFragOff], b[posFragOff+1] = byte(flagsAndFragOff>>8), byte(flagsAndFragOff) } else { *(*uint16)(unsafe.Pointer(&b[posTotalLen : posTotalLen+1][0])) = uint16(h.TotalLen) *(*uint16)(unsafe.Pointer(&b[posFragOff : posFragOff+1][0])) = uint16(flagsAndFragOff) } b[posID], b[posID+1] = byte(h.ID>>8), byte(h.ID) b[posTTL] = byte(h.TTL) b[posProtocol] = byte(h.Protocol) b[posChecksum], b[posChecksum+1] = byte(h.Checksum>>8), byte(h.Checksum) if ip := h.Src.To4(); ip != nil { copy(b[posSrc:posSrc+net.IPv4len], ip[:net.IPv4len]) } if ip := h.Dst.To4(); ip != nil { copy(b[posDst:posDst+net.IPv4len], ip[:net.IPv4len]) } else { return nil, errMissingAddress } if len(h.Options) > 0 { copy(b[HeaderLen:], h.Options) } return b, nil } // ParseHeader parses b as an IPv4 header. func ParseHeader(b []byte) (*Header, error) { if len(b) < HeaderLen { return nil, errHeaderTooShort } hdrlen := int(b[0]&0x0f) << 2 if hdrlen > len(b) { return nil, errBufferTooShort } h := &Header{} h.Version = int(b[0] >> 4) h.Len = hdrlen h.TOS = int(b[posTOS]) if supportsNewIPInput { h.TotalLen = int(b[posTotalLen])<<8 | int(b[posTotalLen+1]) h.FragOff = int(b[posFragOff])<<8 | int(b[posFragOff+1]) } else { h.TotalLen = int(*(*uint16)(unsafe.Pointer(&b[posTotalLen : posTotalLen+1][0]))) h.TotalLen += hdrlen h.FragOff = int(*(*uint16)(unsafe.Pointer(&b[posFragOff : posFragOff+1][0]))) } h.Flags = HeaderFlags(h.FragOff&0xe000) >> 13 h.FragOff = h.FragOff & 0x1fff h.ID = int(b[posID])<<8 | int(b[posID+1]) h.TTL = int(b[posTTL]) h.Protocol = int(b[posProtocol]) h.Checksum = int(b[posChecksum])<<8 | int(b[posChecksum+1]) h.Src = net.IPv4(b[posSrc], b[posSrc+1], b[posSrc+2], b[posSrc+3]) h.Dst = net.IPv4(b[posDst], b[posDst+1], b[posDst+2], b[posDst+3]) if hdrlen-HeaderLen > 0 { h.Options = make([]byte, hdrlen-HeaderLen) copy(h.Options, b[HeaderLen:]) } return h, nil } go.net/ipv4/sockopt_unix.go0000644000175100017510000000323412235217213015262 0ustar spirospiro// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin freebsd linux netbsd openbsd package ipv4 import ( "os" "syscall" ) func ipv4TOS(fd int) (int, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_TOS) if err != nil { return 0, os.NewSyscallError("getsockopt", err) } return v, nil } func setIPv4TOS(fd int, v int) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_TOS, v)) } func ipv4TTL(fd int) (int, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_TTL) if err != nil { return 0, os.NewSyscallError("getsockopt", err) } return v, nil } func setIPv4TTL(fd int, v int) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_TTL, v)) } func ipv4ReceiveTTL(fd int) (bool, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVTTL) if err != nil { return false, os.NewSyscallError("getsockopt", err) } return v == 1, nil } func setIPv4ReceiveTTL(fd int, v bool) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVTTL, boolint(v))) } func ipv4HeaderPrepend(fd int) (bool, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_HDRINCL) if err != nil { return false, os.NewSyscallError("getsockopt", err) } return v == 1, nil } func setIPv4HeaderPrepend(fd int, v bool) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_HDRINCL, boolint(v))) } go.net/ipv4/doc.go0000644000175100017510000001366512235217213013313 0ustar spirospiro// 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. // Package ipv4 implements IP-level socket options for the Internet // Protocol version 4. // // The package provides IP-level socket options that allow // manipulation of IPv4 facilities. The IPv4 and basic host // requirements for IPv4 are defined in RFC 791, RFC 1112 and RFC // 1122. // // // Unicasting // // 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 // a data flow of multiple packets needs to indicate the flow is // important, ipv4.Conn is used to set the type-of-service field on // the IPv4 header for each packet. // // ln, err := net.Listen("tcp4", "0.0.0.0:1024") // if err != nil { // // error handling // } // defer ln.Close() // for { // c, err := ln.Accept() // if err != nil { // // error handling // } // go func(c net.Conn) { // defer c.Close() // // The outgoing packets will be labeled DiffServ assured forwarding // class 1 low drop precedence, as known as AF11 packets. // // if err := ipv4.NewConn(c).SetTOS(DiffServAF11); err != nil { // // error handling // } // if _, err := c.Write(data); err != nil { // // error handling // } // }(c) // } // // // Multicasting // // 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 // you begin multicasting, at a minimum joining network interfaces and // multicast groups. // // en0, err := net.InterfaceByName("en0") // if err != nil { // // error handling // } // en1, err := net.InterfaceByIndex(911) // if err != nil { // // error handling // } // group := net.IPv4(224, 0, 0, 250) // // First, an application listens to an appropriate address with an // appropriate service port. // // c, err := net.ListenPacket("udp4", "0.0.0.0:1024") // if err != nil { // // error handling // } // defer c.Close() // // Second, the application joins multicast groups, starts listening to // 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. // // p := ipv4.NewPacketConn(c) // if err := p.JoinGroup(en0, &net.UDPAddr{IP: group}); err != nil { // // error handling // } // if err := p.JoinGroup(en1, &net.UDPAddr{IP: group}); err != nil { // // error handling // } // // The application might set per packet control message transmissions // between the protocol stack within the kernel. When the application // needs a destination address on an incoming packet, // SetControlMessage of ipv4.PacketConn is used to enable control // message transmissons. // // if err := p.SetControlMessage(ipv4.FlagDst, true); err != nil { // // error handling // } // // The application could identify whether the received packets are // of interest by using the control message that contains the // destination address of the received packet. // // b := make([]byte, 1500) // for { // n, cm, src, err := p.ReadFrom(b) // if err != nil { // // error handling // } // if cm.Dst.IsMulticast() { // if cm.Dst.Equal(group) // // joined group, do something // } else { // // unknown group, discard // continue // } // } // // The application can also send both unicast and multicast packets. // // p.SetTOS(DiffServCS0) // p.SetTTL(16) // if _, err := p.WriteTo(data, nil, src); err != nil { // // error handling // } // dst := &net.UDPAddr{IP: group, Port: 1024} // for _, ifi := range []*net.Interface{en0, en1} { // if err := p.SetMulticastInterface(ifi); err != nil { // // error handling // } // p.SetMulticastTTL(2) // if _, err := p.WriteTo(data, nil, dst); err != nil { // // error handling // } // } // } // // // More multicasting // // An application that uses PacketConn or RawConn may join multiple // multicast groups. For example, a UDP listener with port 1024 might // join two different groups across over two different network // interfaces by using: // // c, err := net.ListenPacket("udp4", "0.0.0.0:1024") // if err != nil { // // error handling // } // defer c.Close() // p := ipv4.NewPacketConn(c) // if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { // // error handling // } // if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}); err != nil { // // error handling // } // if err := p.JoinGroup(en1, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}); err != nil { // // error handling // } // // It is possible for multiple UDP listeners that listen on the same // 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. // // c1, err := net.ListenPacket("udp4", "224.0.0.0:1024") // if err != nil { // // error handling // } // defer c1.Close() // c2, err := net.ListenPacket("udp4", "224.0.0.0:1024") // if err != nil { // // error handling // } // defer c2.Close() // p1 := ipv4.NewPacketConn(c1) // if err := p1.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { // // error handling // } // p2 := ipv4.NewPacketConn(c2) // if err := p2.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { // // error handling // } // // Also it is possible for the application to leave or rejoin a // multicast group on the network interface. // // if err := p.LeaveGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { // // error handling // } // if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 250)}); err != nil { // // error handling // } package ipv4 go.net/ipv4/genericopt_posix.go0000644000175100017510000000230412235217213016113 0ustar spirospiro// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin freebsd linux netbsd openbsd windows package ipv4 import ( "syscall" ) // TOS returns the type-of-service field value for outgoing packets. func (c *genericOpt) TOS() (int, error) { if !c.ok() { return 0, syscall.EINVAL } fd, err := c.sysfd() if err != nil { return 0, err } return ipv4TOS(fd) } // SetTOS sets the type-of-service field value for future outgoing // packets. func (c *genericOpt) SetTOS(tos int) error { if !c.ok() { return syscall.EINVAL } fd, err := c.sysfd() if err != nil { return err } return setIPv4TOS(fd, tos) } // TTL returns the time-to-live field value for outgoing packets. func (c *genericOpt) TTL() (int, error) { if !c.ok() { return 0, syscall.EINVAL } fd, err := c.sysfd() if err != nil { return 0, err } return ipv4TTL(fd) } // SetTTL sets the time-to-live field value for future outgoing // packets. func (c *genericOpt) SetTTL(ttl int) error { if !c.ok() { return syscall.EINVAL } fd, err := c.sysfd() if err != nil { return err } return setIPv4TTL(fd, ttl) } go.net/ipv4/helper_posix.go0000644000175100017510000000146312235217213015240 0ustar spirospiro// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin freebsd linux netbsd openbsd windows package ipv4 import ( "bytes" "net" "syscall" ) func setSyscallIPMreq(mreq *syscall.IPMreq, ifi *net.Interface) error { if ifi == nil { return nil } ifat, err := ifi.Addrs() if err != nil { return err } for _, ifa := range ifat { switch v := ifa.(type) { case *net.IPAddr: if a := v.IP.To4(); a != nil { copy(mreq.Interface[:], a) goto done } case *net.IPNet: if a := v.IP.To4(); a != nil { copy(mreq.Interface[:], a) goto done } } } done: if bytes.Equal(mreq.Multiaddr[:], net.IPv4zero.To4()) { return errNoSuchMulticastInterface } return nil } go.net/ipv4/helper.go0000644000175100017510000000275612235217213014024 0ustar spirospiro// 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. package ipv4 import ( "errors" "net" ) var ( errNoSuchInterface = errors.New("no such interface") errNoSuchMulticastInterface = errors.New("no such multicast interface") ) func boolint(b bool) int { if b { return 1 } return 0 } func netAddrToIP4(a net.Addr) net.IP { switch v := a.(type) { case *net.UDPAddr: if ip := v.IP.To4(); ip != nil { return ip } case *net.IPAddr: if ip := v.IP.To4(); ip != nil { return ip } } return nil } func netIP4ToInterface(ip net.IP) (*net.Interface, error) { ift, err := net.Interfaces() if err != nil { return nil, err } for _, ifi := range ift { ifat, err := ifi.Addrs() if err != nil { return nil, err } for _, ifa := range ifat { switch v := ifa.(type) { case *net.IPAddr: if ip.Equal(v.IP) { return &ifi, nil } case *net.IPNet: if ip.Equal(v.IP) { return &ifi, nil } } } } return nil, errNoSuchInterface } func netInterfaceToIP4(ifi *net.Interface) (net.IP, error) { if ifi == nil { return net.IPv4zero, nil } ifat, err := ifi.Addrs() if err != nil { return nil, err } for _, ifa := range ifat { switch v := ifa.(type) { case *net.IPAddr: if v.IP.To4() != nil { return v.IP, nil } case *net.IPNet: if v.IP.To4() != nil { return v.IP, nil } } } return nil, errNoSuchInterface } go.net/ipv4/unicastsockopt_test.go0000644000175100017510000000612012235217213016642 0ustar spirospiro// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin freebsd linux netbsd openbsd windows package ipv4_test import ( "code.google.com/p/go.net/ipv4" "errors" "net" "os" "runtime" "testing" ) type testUnicastConn interface { TOS() (int, error) SetTOS(int) error TTL() (int, error) SetTTL(int) error } type unicastSockoptTest struct { tos int ttl int } var unicastSockoptTests = []unicastSockoptTest{ {DiffServCS0 | NotECNTransport, 127}, {DiffServAF11 | NotECNTransport, 255}, } func TestTCPUnicastSockopt(t *testing.T) { for _, tt := range unicastSockoptTests { listener := make(chan net.Listener) go tcpListener(t, "127.0.0.1:0", listener) ln := <-listener if ln == nil { return } defer ln.Close() c, err := net.Dial("tcp4", ln.Addr().String()) if err != nil { t.Errorf("net.Dial failed: %v", err) return } defer c.Close() cc := ipv4.NewConn(c) if err := testUnicastSockopt(t, tt, cc); err != nil { break } } } func tcpListener(t *testing.T, addr string, listener chan<- net.Listener) { ln, err := net.Listen("tcp4", addr) if err != nil { t.Errorf("net.Listen failed: %v", err) listener <- nil return } listener <- ln c, err := ln.Accept() if err != nil { return } c.Close() } func TestUDPUnicastSockopt(t *testing.T) { for _, tt := range unicastSockoptTests { c, err := net.ListenPacket("udp4", "127.0.0.1:0") if err != nil { t.Errorf("net.ListenPacket failed: %v", err) return } defer c.Close() p := ipv4.NewPacketConn(c) if err := testUnicastSockopt(t, tt, p); err != nil { break } } } func TestIPUnicastSockopt(t *testing.T) { if os.Getuid() != 0 { t.Skip("must be root") } for _, tt := range unicastSockoptTests { c, err := net.ListenPacket("ip4:icmp", "127.0.0.1") if err != nil { t.Errorf("net.ListenPacket failed: %v", err) return } defer c.Close() r, err := ipv4.NewRawConn(c) if err != nil { t.Errorf("ipv4.NewRawConn failed: %v", err) return } if err := testUnicastSockopt(t, tt, r); err != nil { break } } } func testUnicastSockopt(t *testing.T, tt unicastSockoptTest, c testUnicastConn) error { switch runtime.GOOS { case "windows": // IP_TOS option is supported on Windows 8 and beyond. t.Logf("skipping IP_TOS test on %q", runtime.GOOS) default: if err := c.SetTOS(tt.tos); err != nil { t.Errorf("ipv4.Conn.SetTOS failed: %v", err) return err } if v, err := c.TOS(); err != nil { t.Errorf("ipv4.Conn.TOS failed: %v", err) return err } else if v != tt.tos { t.Errorf("Got unexpected TOS value %v; expected %v", v, tt.tos) return errors.New("Got unexpected TOS value") } } if err := c.SetTTL(tt.ttl); err != nil { t.Errorf("ipv4.Conn.SetTTL failed: %v", err) return err } if v, err := c.TTL(); err != nil { t.Errorf("ipv4.Conn.TTL failed: %v", err) return err } else if v != tt.ttl { t.Errorf("Got unexpected TTL value %v; expected %v", v, tt.ttl) return errors.New("Got unexpected TTL value") } return nil } go.net/ipv4/unicast_test.go0000644000175100017510000001230312235217213015237 0ustar spirospiro// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin freebsd linux netbsd openbsd package ipv4_test import ( "code.google.com/p/go.net/ipv4" "net" "os" "testing" ) func benchmarkUDPListener() (net.PacketConn, net.Addr, error) { c, err := net.ListenPacket("udp4", "127.0.0.1:0") if err != nil { return nil, nil, err } dst, err := net.ResolveUDPAddr("udp4", c.LocalAddr().String()) if err != nil { c.Close() return nil, nil, err } return c, dst, nil } func BenchmarkReadWriteNetUDP(b *testing.B) { c, dst, err := benchmarkUDPListener() if err != nil { b.Fatalf("benchmarkUDPListener failed: %v", err) } defer c.Close() wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128) b.ResetTimer() for i := 0; i < b.N; i++ { benchmarkReadWriteNetUDP(b, c, wb, rb, dst) } } func benchmarkReadWriteNetUDP(b *testing.B, c net.PacketConn, wb, rb []byte, dst net.Addr) { if _, err := c.WriteTo(wb, dst); err != nil { b.Fatalf("net.PacketConn.WriteTo failed: %v", err) } if _, _, err := c.ReadFrom(rb); err != nil { b.Fatalf("net.PacketConn.ReadFrom failed: %v", err) } } func BenchmarkReadWriteIPv4UDP(b *testing.B) { c, dst, err := benchmarkUDPListener() if err != nil { b.Fatalf("benchmarkUDPListener failed: %v", err) } defer c.Close() p := ipv4.NewPacketConn(c) cf := ipv4.FlagTTL | ipv4.FlagInterface if err := p.SetControlMessage(cf, true); err != nil { b.Fatalf("ipv4.PacketConn.SetControlMessage failed: %v", err) } ifi := loopbackInterface() wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128) b.ResetTimer() for i := 0; i < b.N; i++ { benchmarkReadWriteIPv4UDP(b, p, wb, rb, dst, ifi) } } func benchmarkReadWriteIPv4UDP(b *testing.B, p *ipv4.PacketConn, wb, rb []byte, dst net.Addr, ifi *net.Interface) { cm := ipv4.ControlMessage{TTL: 1} if ifi != nil { cm.IfIndex = ifi.Index } if _, err := p.WriteTo(wb, &cm, dst); err != nil { b.Fatalf("ipv4.PacketConn.WriteTo failed: %v", err) } if _, _, _, err := p.ReadFrom(rb); err != nil { b.Fatalf("ipv4.PacketConn.ReadFrom failed: %v", err) } } func TestReadWriteUnicastIPPayloadUDP(t *testing.T) { c, err := net.ListenPacket("udp4", "127.0.0.1:0") if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() dst, err := net.ResolveUDPAddr("udp4", c.LocalAddr().String()) if err != nil { t.Fatalf("net.ResolveUDPAddr failed: %v", err) } p := ipv4.NewPacketConn(c) cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface for i, toggle := range []bool{true, false, true} { if err := p.SetControlMessage(cf, toggle); err != nil { t.Fatalf("ipv4.PacketConn.SetControlMessage failed: %v", err) } writeThenReadPayload(t, i, p, []byte("HELLO-R-U-THERE"), dst) } } func TestReadWriteUnicastIPPayloadICMP(t *testing.T) { if os.Getuid() != 0 { t.Skip("must be root") } c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() dst, err := net.ResolveIPAddr("ip4", "127.0.0.1") if err != nil { t.Fatalf("ResolveIPAddr failed: %v", err) } p := ipv4.NewPacketConn(c) cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface for i, toggle := range []bool{true, false, true} { wb, err := (&icmpMessage{ Type: ipv4.ICMPTypeEcho, Code: 0, Body: &icmpEcho{ ID: os.Getpid() & 0xffff, Seq: i + 1, Data: []byte("HELLO-R-U-THERE"), }, }).Marshal() if err != nil { t.Fatalf("icmpMessage.Marshal failed: %v", err) } if err := p.SetControlMessage(cf, toggle); err != nil { t.Fatalf("ipv4.PacketConn.SetControlMessage failed: %v", err) } rb := writeThenReadPayload(t, i, p, wb, dst) m, err := parseICMPMessage(rb) if err != nil { t.Fatalf("parseICMPMessage failed: %v", err) } if m.Type != ipv4.ICMPTypeEchoReply || m.Code != 0 { t.Fatalf("got type=%v, code=%v; expected type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) } } } func TestReadWriteUnicastIPDatagram(t *testing.T) { if os.Getuid() != 0 { t.Skip("must be root") } c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() dst, err := net.ResolveIPAddr("ip4", "127.0.0.1") if err != nil { t.Fatalf("ResolveIPAddr failed: %v", err) } r, err := ipv4.NewRawConn(c) if err != nil { t.Fatalf("ipv4.NewRawConn failed: %v", err) } cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface for i, toggle := range []bool{true, false, true} { wb, err := (&icmpMessage{ Type: ipv4.ICMPTypeEcho, Code: 0, Body: &icmpEcho{ ID: os.Getpid() & 0xffff, Seq: i + 1, Data: []byte("HELLO-R-U-THERE"), }, }).Marshal() if err != nil { t.Fatalf("icmpMessage.Marshal failed: %v", err) } if err := r.SetControlMessage(cf, toggle); err != nil { t.Fatalf("ipv4.RawConn.SetControlMessage failed: %v", err) } rb := writeThenReadDatagram(t, i, r, wb, nil, dst) m, err := parseICMPMessage(rb) if err != nil { t.Fatalf("parseICMPMessage failed: %v", err) } if m.Type != ipv4.ICMPTypeEchoReply || m.Code != 0 { t.Fatalf("got type=%v, code=%v; expected type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) } } } go.net/ipv4/sockopt_plan9.go0000644000175100017510000000063412235217213015323 0ustar spirospiro// 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. package ipv4 import "syscall" func ipv4HeaderPrepend(fd int) (bool, error) { // TODO(mikio): Implement this return false, syscall.EPLAN9 } func setIPv4HeaderPrepend(fd int, v bool) error { // TODO(mikio): Implement this return syscall.EPLAN9 } go.net/ipv4/sockopt_bsd.go0000644000175100017510000000611412235217213015047 0ustar spirospiro// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin freebsd netbsd openbsd package ipv4 import ( "net" "os" "syscall" ) func ipv4MulticastTTL(fd int) (int, error) { v, err := syscall.GetsockoptByte(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL) if err != nil { return 0, os.NewSyscallError("getsockopt", err) } return int(v), nil } func setIPv4MulticastTTL(fd int, v int) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptByte(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL, byte(v))) } func ipv4ReceiveDestinationAddress(fd int) (bool, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVDSTADDR) if err != nil { return false, os.NewSyscallError("getsockopt", err) } return v == 1, nil } func setIPv4ReceiveDestinationAddress(fd int, v bool) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVDSTADDR, boolint(v))) } func ipv4ReceiveInterface(fd int) (bool, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVIF) if err != nil { return false, os.NewSyscallError("getsockopt", err) } return v == 1, nil } func setIPv4ReceiveInterface(fd int, v bool) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVIF, boolint(v))) } func ipv4MulticastInterface(fd int) (*net.Interface, error) { v, err := syscall.GetsockoptInet4Addr(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF) if err != nil { return nil, os.NewSyscallError("getsockopt", err) } return netIP4ToInterface(net.IPv4(v[0], v[1], v[2], v[3])) } func setIPv4MulticastInterface(fd int, ifi *net.Interface) error { ip, err := netInterfaceToIP4(ifi) if err != nil { return os.NewSyscallError("setsockopt", err) } var v [4]byte copy(v[:], ip.To4()) return os.NewSyscallError("setsockopt", syscall.SetsockoptInet4Addr(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF, v)) } func ipv4MulticastLoopback(fd int) (bool, error) { v, err := syscall.GetsockoptByte(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP) if err != nil { return false, os.NewSyscallError("getsockopt", err) } return v == 1, nil } func setIPv4MulticastLoopback(fd int, v bool) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptByte(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP, byte(boolint(v)))) } func joinIPv4Group(fd int, ifi *net.Interface, grp net.IP) error { mreq := syscall.IPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}} if err := setSyscallIPMreq(&mreq, ifi); err != nil { return err } return os.NewSyscallError("setsockopt", syscall.SetsockoptIPMreq(fd, ianaProtocolIP, syscall.IP_ADD_MEMBERSHIP, &mreq)) } func leaveIPv4Group(fd int, ifi *net.Interface, grp net.IP) error { mreq := syscall.IPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}} if err := setSyscallIPMreq(&mreq, ifi); err != nil { return err } return os.NewSyscallError("setsockopt", syscall.SetsockoptIPMreq(fd, ianaProtocolIP, syscall.IP_DROP_MEMBERSHIP, &mreq)) } go.net/ipv4/payload.go0000644000175100017510000000441412235217213014167 0ustar spirospiro// 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. package ipv4 import ( "net" "syscall" ) // A payloadHandler represents the IPv4 datagram payload handler. type payloadHandler struct { net.PacketConn rawOpt } func (c *payloadHandler) ok() bool { return c != nil && c.PacketConn != nil } // ReadFrom reads a payload of the received IPv4 datagram, from the // 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) { if !c.ok() { return 0, nil, nil, syscall.EINVAL } oob := newControlMessage(&c.rawOpt) var oobn int switch c := c.PacketConn.(type) { case *net.UDPConn: if n, oobn, _, src, err = c.ReadMsgUDP(b, oob); err != nil { return 0, nil, nil, err } case *net.IPConn: nb := make([]byte, maxHeaderLen+len(b)) if n, oobn, _, src, err = c.ReadMsgIP(nb, oob); err != nil { return 0, nil, nil, err } hdrlen := int(nb[0]&0x0f) << 2 copy(b, nb[hdrlen:]) n -= hdrlen default: return 0, nil, nil, errInvalidConnType } if cm, err = parseControlMessage(oob[:oobn]); err != nil { return 0, nil, nil, err } if cm != nil { cm.Src = netAddrToIP4(src) } return } // 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 // the datagram path and the outgoing interface to be specified. // Currently only Linux supports 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() { return 0, syscall.EINVAL } oob := marshalControlMessage(cm) if dst == nil { return 0, errMissingAddress } switch c := c.PacketConn.(type) { case *net.UDPConn: n, _, err = c.WriteMsgUDP(b, oob, dst.(*net.UDPAddr)) case *net.IPConn: n, _, err = c.WriteMsgIP(b, oob, dst.(*net.IPAddr)) default: return 0, errInvalidConnType } if err != nil { return 0, err } return } go.net/ipv4/helper_plan9.go0000644000175100017510000000115112235217213015113 0ustar spirospiro// 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. package ipv4 import "syscall" func (c *genericOpt) sysfd() (int, error) { // TODO(mikio): Implement this return 0, syscall.EPLAN9 } func (c *dgramOpt) sysfd() (int, error) { // TODO(mikio): Implement this return 0, syscall.EPLAN9 } func (c *payloadHandler) sysfd() (int, error) { // TODO(mikio): Implement this return 0, syscall.EPLAN9 } func (c *packetHandler) sysfd() (int, error) { // TODO(mikio): Implement this return 0, syscall.EPLAN9 } go.net/ipv4/multicastlistener_test.go0000644000175100017510000001407112235217213017350 0ustar spirospiro// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin freebsd linux netbsd openbsd package ipv4_test import ( "code.google.com/p/go.net/ipv4" "net" "os" "testing" ) var udpMultipleGroupListenerTests = []struct { gaddr *net.UDPAddr }{ {&net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}}, // see RFC 4727 {&net.UDPAddr{IP: net.IPv4(224, 0, 0, 250)}}, // see RFC 4727 {&net.UDPAddr{IP: net.IPv4(224, 0, 0, 254)}}, // see RFC 4727 } func TestUDPSingleConnWithMultipleGroupListeners(t *testing.T) { if testing.Short() || !*testExternal { t.Skip("to avoid external network") } for _, tt := range udpMultipleGroupListenerTests { // listen to a wildcard address with no reusable port c, err := net.ListenPacket("udp4", "0.0.0.0:0") if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() p := ipv4.NewPacketConn(c) var mift []*net.Interface ift, err := net.Interfaces() if err != nil { t.Fatalf("net.Interfaces failed: %v", err) } for i, ifi := range ift { if _, ok := isMulticastAvailable(&ifi); !ok { continue } if err := p.JoinGroup(&ifi, tt.gaddr); err != nil { t.Fatalf("ipv4.PacketConn.JoinGroup %v on %v failed: %v", tt.gaddr, ifi, err) } mift = append(mift, &ift[i]) } for _, ifi := range mift { if err := p.LeaveGroup(ifi, tt.gaddr); err != nil { t.Fatalf("ipv4.PacketConn.LeaveGroup %v on %v failed: %v", tt.gaddr, ifi, err) } } } } func TestUDPMultipleConnWithMultipleGroupListeners(t *testing.T) { if testing.Short() || !*testExternal { t.Skip("to avoid external network") } for _, tt := range udpMultipleGroupListenerTests { // listen to a group address, actually a wildcard address // with reusable port c1, err := net.ListenPacket("udp4", "224.0.0.0:1024") // see RFC 4727 if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c1.Close() c2, err := net.ListenPacket("udp4", "224.0.0.0:1024") // see RFC 4727 if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c2.Close() var ps [2]*ipv4.PacketConn ps[0] = ipv4.NewPacketConn(c1) ps[1] = ipv4.NewPacketConn(c2) var mift []*net.Interface ift, err := net.Interfaces() if err != nil { t.Fatalf("net.Interfaces failed: %v", err) } for i, ifi := range ift { if _, ok := isMulticastAvailable(&ifi); !ok { continue } for _, p := range ps { if err := p.JoinGroup(&ifi, tt.gaddr); err != nil { t.Fatalf("ipv4.PacketConn.JoinGroup %v on %v failed: %v", tt.gaddr, ifi, err) } } mift = append(mift, &ift[i]) } for _, ifi := range mift { for _, p := range ps { if err := p.LeaveGroup(ifi, tt.gaddr); err != nil { t.Fatalf("ipv4.PacketConn.LeaveGroup %v on %v failed: %v", tt.gaddr, ifi, err) } } } } } func TestIPSingleConnWithSingleGroupListener(t *testing.T) { if testing.Short() || !*testExternal { t.Skip("to avoid external network") } if os.Getuid() != 0 { t.Skip("must be root") } // listen to a wildcard address c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() r, err := ipv4.NewRawConn(c) if err != nil { t.Fatalf("ipv4.RawConn failed: %v", err) } gaddr := &net.IPAddr{IP: net.IPv4(224, 0, 0, 254)} // see RFC 4727 var mift []*net.Interface ift, err := net.Interfaces() if err != nil { t.Fatalf("net.Interfaces failed: %v", err) } for i, ifi := range ift { if _, ok := isMulticastAvailable(&ifi); !ok { continue } if err := r.JoinGroup(&ifi, gaddr); err != nil { t.Fatalf("ipv4.RawConn.JoinGroup on %v failed: %v", ifi, err) } mift = append(mift, &ift[i]) } for _, ifi := range mift { if err := r.LeaveGroup(ifi, gaddr); err != nil { t.Fatalf("ipv4.RawConn.LeaveGroup on %v failed: %v", ifi, err) } } } func TestUDPPerInterfaceSingleConnWithSingleGroupListener(t *testing.T) { if testing.Short() || !*testExternal { t.Skip("to avoid external network") } gaddr := &net.IPAddr{IP: net.IPv4(224, 0, 0, 254)} // see RFC 4727 type ml struct { c *ipv4.PacketConn ifi *net.Interface } var mlt []*ml ift, err := net.Interfaces() if err != nil { t.Fatalf("net.Interfaces failed: %v", err) } for i, ifi := range ift { ip, ok := isMulticastAvailable(&ifi) if !ok { continue } // listen to a unicast interface address c, err := net.ListenPacket("udp4", ip.String()+":"+"1024") // see RFC 4727 if err != nil { t.Fatalf("net.ListenPacket with %v failed: %v", ip, err) } defer c.Close() p := ipv4.NewPacketConn(c) if err := p.JoinGroup(&ifi, gaddr); err != nil { t.Fatalf("ipv4.PacketConn.JoinGroup on %v failed: %v", ifi, err) } mlt = append(mlt, &ml{p, &ift[i]}) } for _, m := range mlt { if err := m.c.LeaveGroup(m.ifi, gaddr); err != nil { t.Fatalf("ipv4.PacketConn.LeaveGroup on %v failed: %v", m.ifi, err) } } } func TestIPPerInterfaceSingleConnWithSingleGroupListener(t *testing.T) { if testing.Short() || !*testExternal { t.Skip("to avoid external network") } if os.Getuid() != 0 { t.Skip("must be root") } gaddr := &net.IPAddr{IP: net.IPv4(224, 0, 0, 254)} // see RFC 4727 type ml struct { c *ipv4.RawConn ifi *net.Interface } var mlt []*ml ift, err := net.Interfaces() if err != nil { t.Fatalf("net.Interfaces failed: %v", err) } for i, ifi := range ift { ip, ok := isMulticastAvailable(&ifi) if !ok { continue } // listen to a unicast interface address c, err := net.ListenPacket("ip4:253", ip.String()) // see RFC 4727 if err != nil { t.Fatalf("net.ListenPacket with %v failed: %v", ip, err) } defer c.Close() r, err := ipv4.NewRawConn(c) if err != nil { t.Fatalf("ipv4.NewRawConn failed: %v", err) } if err := r.JoinGroup(&ifi, gaddr); err != nil { t.Fatalf("ipv4.RawConn.JoinGroup on %v failed: %v", ifi, err) } mlt = append(mlt, &ml{r, &ift[i]}) } for _, m := range mlt { if err := m.c.LeaveGroup(m.ifi, gaddr); err != nil { t.Fatalf("ipv4.RawConn.LeaveGroup on %v failed: %v", m.ifi, err) } } } go.net/ipv4/mockicmp_test.go0000644000175100017510000000527712235217213015407 0ustar spirospiro// 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. package ipv4_test import ( "code.google.com/p/go.net/ipv4" "errors" "flag" ) var testExternal = flag.Bool("external", true, "allow use of external networks during long test") // icmpMessage represents an ICMP message. type icmpMessage struct { Type ipv4.ICMPType // type Code int // code Checksum int // checksum Body icmpMessageBody // body } // icmpMessageBody represents an ICMP message body. type icmpMessageBody interface { Len() int Marshal() ([]byte, error) } // Marshal returns the binary enconding of the ICMP echo request or // reply message m. func (m *icmpMessage) Marshal() ([]byte, error) { b := []byte{byte(m.Type), byte(m.Code), 0, 0} if m.Body != nil && m.Body.Len() != 0 { mb, err := m.Body.Marshal() if err != nil { return nil, err } b = append(b, mb...) } csumcv := len(b) - 1 // checksum coverage s := uint32(0) for i := 0; i < csumcv; i += 2 { s += uint32(b[i+1])<<8 | uint32(b[i]) } if csumcv&1 == 0 { s += uint32(b[csumcv]) } s = s>>16 + s&0xffff s = s + s>>16 // Place checksum back in header; using ^= avoids the // assumption the checksum bytes are zero. b[2] ^= byte(^s) b[3] ^= byte(^s >> 8) return b, nil } // parseICMPMessage parses b as an ICMP message. func parseICMPMessage(b []byte) (*icmpMessage, error) { msglen := len(b) if msglen < 4 { return nil, errors.New("message too short") } m := &icmpMessage{Type: ipv4.ICMPType(b[0]), Code: int(b[1]), Checksum: int(b[2])<<8 | int(b[3])} if msglen > 4 { var err error switch m.Type { case ipv4.ICMPTypeEcho, ipv4.ICMPTypeEchoReply: m.Body, err = parseICMPEcho(b[4:]) if err != nil { return nil, err } } } return m, nil } // imcpEcho represenets an ICMP echo request or reply message body. type icmpEcho struct { ID int // identifier Seq int // sequence number Data []byte // data } func (p *icmpEcho) Len() int { if p == nil { return 0 } return 4 + len(p.Data) } // Marshal returns the binary enconding of the ICMP echo request or // reply message body p. func (p *icmpEcho) Marshal() ([]byte, error) { b := make([]byte, 4+len(p.Data)) b[0], b[1] = byte(p.ID>>8), byte(p.ID) b[2], b[3] = byte(p.Seq>>8), byte(p.Seq) copy(b[4:], p.Data) return b, nil } // parseICMPEcho parses b as an ICMP echo request or reply message // body. func parseICMPEcho(b []byte) (*icmpEcho, error) { bodylen := len(b) p := &icmpEcho{ID: int(b[0])<<8 | int(b[1]), Seq: int(b[2])<<8 | int(b[3])} if bodylen > 4 { p.Data = make([]byte, bodylen-4) copy(p.Data, b[4:]) } return p, nil } go.net/ipv4/gentest.go0000644000175100017510000001037112235217213014206 0ustar spirospiro// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build ignore // This program generates internet protocol constants by reading IANA // protocol registries. // // Usage: // go run gentest.go > iana_test.go package main import ( "bytes" "encoding/xml" "fmt" "go/format" "io" "net/http" "os" "strconv" "strings" ) var registries = []struct { url string parse func(io.Writer, io.Reader) error }{ { "http://www.iana.org/assignments/dscp-registry/dscp-registry.xml", parseDSCPRegistry, }, { "http://www.iana.org/assignments/ipv4-tos-byte/ipv4-tos-byte.xml", parseTOSTCByte, }, } func main() { var bb bytes.Buffer fmt.Fprintf(&bb, "// go run gentest.go\n") fmt.Fprintf(&bb, "// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n") fmt.Fprintf(&bb, "package ipv4_test\n\n") for _, r := range registries { resp, err := http.Get(r.url) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { fmt.Fprintf(os.Stderr, "got HTTP status code %v for %v\n", resp.StatusCode, r.url) os.Exit(1) } if err := r.parse(&bb, resp.Body); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } fmt.Fprintf(&bb, "\n") } b, err := format.Source(bb.Bytes()) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } os.Stdout.Write(b) } func parseDSCPRegistry(w io.Writer, r io.Reader) error { dec := xml.NewDecoder(r) var dr dscpRegistry if err := dec.Decode(&dr); err != nil { return err } drs := dr.escape() fmt.Fprintf(w, "// %s, Updated: %s\n", dr.Title, dr.Updated) fmt.Fprintf(w, "const (\n") for _, dr := range drs { fmt.Fprintf(w, "DiffServ%s = %#x", dr.Name, dr.Value) fmt.Fprintf(w, "// %s\n", dr.OrigName) } fmt.Fprintf(w, ")\n") return nil } type dscpRegistry struct { XMLName xml.Name `xml:"registry"` Title string `xml:"title"` Updated string `xml:"updated"` Note string `xml:"note"` RegTitle string `xml:"registry>title"` PoolRecords []struct { Name string `xml:"name"` Space string `xml:"space"` } `xml:"registry>record"` Records []struct { Name string `xml:"name"` Space string `xml:"space"` } `xml:"registry>registry>record"` } type canonDSCPRecord struct { OrigName string Name string Value int } func (drr *dscpRegistry) escape() []canonDSCPRecord { drs := make([]canonDSCPRecord, len(drr.Records)) sr := strings.NewReplacer( "+", "", "-", "", "/", "", ".", "", " ", "", ) for i, dr := range drr.Records { s := strings.TrimSpace(dr.Name) drs[i].OrigName = s drs[i].Name = sr.Replace(s) n, err := strconv.ParseUint(dr.Space, 2, 8) if err != nil { continue } drs[i].Value = int(n) << 2 } return drs } func parseTOSTCByte(w io.Writer, r io.Reader) error { dec := xml.NewDecoder(r) var ttb tosTCByte if err := dec.Decode(&ttb); err != nil { return err } trs := ttb.escape() fmt.Fprintf(w, "// %s, Updated: %s\n", ttb.Title, ttb.Updated) fmt.Fprintf(w, "const (\n") for _, tr := range trs { fmt.Fprintf(w, "%s = %#x", tr.Keyword, tr.Value) fmt.Fprintf(w, "// %s\n", tr.OrigKeyword) } fmt.Fprintf(w, ")\n") return nil } type tosTCByte struct { XMLName xml.Name `xml:"registry"` Title string `xml:"title"` Updated string `xml:"updated"` Note string `xml:"note"` RegTitle string `xml:"registry>title"` Records []struct { Binary string `xml:"binary"` Keyword string `xml:"keyword"` } `xml:"registry>record"` } type canonTOSTCByteRecord struct { OrigKeyword string Keyword string Value int } func (ttb *tosTCByte) escape() []canonTOSTCByteRecord { trs := make([]canonTOSTCByteRecord, len(ttb.Records)) sr := strings.NewReplacer( "Capable", "", "(", "", ")", "", "+", "", "-", "", "/", "", ".", "", " ", "", ) for i, tr := range ttb.Records { s := strings.TrimSpace(tr.Keyword) trs[i].OrigKeyword = s ss := strings.Split(s, " ") if len(ss) > 1 { trs[i].Keyword = strings.Join(ss[1:], " ") } else { trs[i].Keyword = ss[0] } trs[i].Keyword = sr.Replace(trs[i].Keyword) n, err := strconv.ParseUint(tr.Binary, 2, 8) if err != nil { continue } trs[i].Value = int(n) } return trs } go.net/ipv4/dgramopt_posix.go0000644000175100017510000000562712235217213015604 0ustar spirospiro// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin freebsd linux netbsd openbsd windows package ipv4 import ( "net" "syscall" ) // MulticastTTL returns the time-to-live field value for outgoing // multicast packets. func (c *dgramOpt) MulticastTTL() (int, error) { if !c.ok() { return 0, syscall.EINVAL } fd, err := c.sysfd() if err != nil { return 0, err } return ipv4MulticastTTL(fd) } // SetMulticastTTL sets the time-to-live field value for future // outgoing multicast packets. func (c *dgramOpt) SetMulticastTTL(ttl int) error { if !c.ok() { return syscall.EINVAL } fd, err := c.sysfd() if err != nil { return err } return setIPv4MulticastTTL(fd, ttl) } // MulticastInterface returns the default interface for multicast // packet transmissions. func (c *dgramOpt) MulticastInterface() (*net.Interface, error) { if !c.ok() { return nil, syscall.EINVAL } fd, err := c.sysfd() if err != nil { return nil, err } return ipv4MulticastInterface(fd) } // SetMulticastInterface sets the default interface for future // multicast packet transmissions. func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error { if !c.ok() { return syscall.EINVAL } fd, err := c.sysfd() if err != nil { return err } return setIPv4MulticastInterface(fd, ifi) } // MulticastLoopback reports whether transmitted multicast packets // should be copied and send back to the originator. func (c *dgramOpt) MulticastLoopback() (bool, error) { if !c.ok() { return false, syscall.EINVAL } fd, err := c.sysfd() if err != nil { return false, err } return ipv4MulticastLoopback(fd) } // SetMulticastLoopback sets whether transmitted multicast packets // should be copied and send back to the originator. func (c *dgramOpt) SetMulticastLoopback(on bool) error { if !c.ok() { return syscall.EINVAL } fd, err := c.sysfd() if err != nil { return err } return setIPv4MulticastLoopback(fd, on) } // JoinGroup joins the group address group on the interface ifi. // It uses the system assigned multicast interface when ifi is nil, // although this is not recommended because the assignment depends on // platforms and sometimes it might require routing configuration. func (c *dgramOpt) JoinGroup(ifi *net.Interface, group net.Addr) error { if !c.ok() { return syscall.EINVAL } fd, err := c.sysfd() if err != nil { return err } grp := netAddrToIP4(group) if grp == nil { return errMissingAddress } return joinIPv4Group(fd, ifi, grp) } // LeaveGroup leaves the group address group on the interface ifi. func (c *dgramOpt) LeaveGroup(ifi *net.Interface, group net.Addr) error { if !c.ok() { return syscall.EINVAL } fd, err := c.sysfd() if err != nil { return err } grp := netAddrToIP4(group) if grp == nil { return errMissingAddress } return leaveIPv4Group(fd, ifi, grp) } go.net/ipv4/sockopt_windows.go0000644000175100017510000001151312235217213015770 0ustar spirospiro// 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. package ipv4 import ( "net" "os" "syscall" "unsafe" ) // Please refer to the online manual; // http://msdn.microsoft.com/en-us/library/windows/desktop/ms738586(v=vs.85).aspx func ipv4TOS(fd syscall.Handle) (int, error) { var v int32 l := int32(4) if err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_TOS, (*byte)(unsafe.Pointer(&v)), &l); err != nil { return 0, os.NewSyscallError("getsockopt", err) } return int(v), nil } func setIPv4TOS(fd syscall.Handle, v int) error { vv := int32(v) return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_TOS, (*byte)(unsafe.Pointer(&vv)), 4)) } func ipv4TTL(fd syscall.Handle) (int, error) { var v int32 l := int32(4) if err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_TTL, (*byte)(unsafe.Pointer(&v)), &l); err != nil { return 0, os.NewSyscallError("getsockopt", err) } return int(v), nil } func setIPv4TTL(fd syscall.Handle, v int) error { vv := int32(v) return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_TTL, (*byte)(unsafe.Pointer(&vv)), 4)) } func ipv4MulticastTTL(fd syscall.Handle) (int, error) { var v int32 l := int32(4) if err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL, (*byte)(unsafe.Pointer(&v)), &l); err != nil { return 0, os.NewSyscallError("getsockopt", err) } return int(v), nil } func setIPv4MulticastTTL(fd syscall.Handle, v int) error { vv := int32(v) return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL, (*byte)(unsafe.Pointer(&vv)), 4)) } func ipv4ReceiveTTL(fd syscall.Handle) (bool, error) { // NOTE: Not supported yet on any Windows return false, syscall.EWINDOWS } func setIPv4ReceiveTTL(fd syscall.Handle, v bool) error { // NOTE: Not supported yet on any Windows return syscall.EWINDOWS } func ipv4ReceiveDestinationAddress(fd syscall.Handle) (bool, error) { // TODO(mikio): Implement this for XP and beyond return false, syscall.EWINDOWS } func setIPv4ReceiveDestinationAddress(fd syscall.Handle, v bool) error { // TODO(mikio): Implement this for XP and beyond return syscall.EWINDOWS } func ipv4HeaderPrepend(fd syscall.Handle) (bool, error) { // TODO(mikio): Implement this for XP and beyond return false, syscall.EWINDOWS } func setIPv4HeaderPrepend(fd syscall.Handle, v bool) error { // TODO(mikio): Implement this for XP and beyond return syscall.EWINDOWS } func ipv4ReceiveInterface(fd syscall.Handle) (bool, error) { // TODO(mikio): Implement this for Vista and beyond return false, syscall.EWINDOWS } func setIPv4ReceiveInterface(fd syscall.Handle, v bool) error { // TODO(mikio): Implement this for Vista and beyond return syscall.EWINDOWS } func ipv4MulticastInterface(fd syscall.Handle) (*net.Interface, error) { var v [4]byte l := int32(4) if err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF, (*byte)(unsafe.Pointer(&v[0])), &l); err != nil { return nil, os.NewSyscallError("getsockopt", err) } return netIP4ToInterface(net.IPv4(v[0], v[1], v[2], v[3])) } func setIPv4MulticastInterface(fd syscall.Handle, ifi *net.Interface) error { ip, err := netInterfaceToIP4(ifi) if err != nil { return os.NewSyscallError("setsockopt", err) } var v [4]byte copy(v[:], ip.To4()) return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF, (*byte)(unsafe.Pointer(&v[0])), 4)) } func ipv4MulticastLoopback(fd syscall.Handle) (bool, error) { var v int32 l := int32(4) if err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP, (*byte)(unsafe.Pointer(&v)), &l); err != nil { return false, os.NewSyscallError("getsockopt", err) } return v == 1, nil } func setIPv4MulticastLoopback(fd syscall.Handle, v bool) error { vv := int32(boolint(v)) return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP, (*byte)(unsafe.Pointer(&vv)), 4)) } func joinIPv4Group(fd syscall.Handle, ifi *net.Interface, grp net.IP) error { mreq := syscall.IPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}} if err := setSyscallIPMreq(&mreq, ifi); err != nil { return err } return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_ADD_MEMBERSHIP, (*byte)(unsafe.Pointer(&mreq)), int32(unsafe.Sizeof(mreq)))) } func leaveIPv4Group(fd syscall.Handle, ifi *net.Interface, grp net.IP) error { mreq := syscall.IPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}} if err := setSyscallIPMreq(&mreq, ifi); err != nil { return err } return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_DROP_MEMBERSHIP, (*byte)(unsafe.Pointer(&mreq)), int32(unsafe.Sizeof(mreq)))) } go.net/ipv4/example_test.go0000644000175100017510000001274512235217213015236 0ustar spirospiro// 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. package ipv4_test import ( "code.google.com/p/go.net/ipv4" "log" "net" ) func ExampleUnicastTCPListener() { ln, err := net.Listen("tcp4", "0.0.0.0:1024") if err != nil { log.Fatal(err) } defer ln.Close() for { c, err := ln.Accept() if err != nil { log.Fatal(err) } go func(c net.Conn) { defer c.Close() err := ipv4.NewConn(c).SetTOS(DiffServAF11) if err != nil { log.Fatal(err) } _, err = c.Write([]byte("HELLO-R-U-THERE-ACK")) if err != nil { log.Fatal(err) } }(c) } } func ExampleMulticastUDPListener() { en0, err := net.InterfaceByName("en0") if err != nil { log.Fatal(err) } en1, err := net.InterfaceByIndex(911) if err != nil { log.Fatal(err) } group := net.IPv4(224, 0, 0, 250) c, err := net.ListenPacket("udp4", "0.0.0.0:1024") if err != nil { log.Fatal(err) } defer c.Close() p := ipv4.NewPacketConn(c) err = p.JoinGroup(en0, &net.UDPAddr{IP: group}) if err != nil { log.Fatal(err) } err = p.JoinGroup(en1, &net.UDPAddr{IP: group}) if err != nil { log.Fatal(err) } err = p.SetControlMessage(ipv4.FlagDst, true) if err != nil { log.Fatal(err) } b := make([]byte, 1500) for { n, cm, src, err := p.ReadFrom(b) if err != nil { log.Fatal(err) } if cm.Dst.IsMulticast() { if cm.Dst.Equal(group) { // joined group, do something } else { // unknown group, discard continue } } p.SetTOS(DiffServCS7) p.SetTTL(16) _, err = p.WriteTo(b[:n], nil, src) if err != nil { log.Fatal(err) } dst := &net.UDPAddr{IP: group, Port: 1024} for _, ifi := range []*net.Interface{en0, en1} { err := p.SetMulticastInterface(ifi) if err != nil { log.Fatal(err) } p.SetMulticastTTL(2) _, err = p.WriteTo(b[:n], nil, dst) if err != nil { log.Fatal(err) } } } err = p.LeaveGroup(en1, &net.UDPAddr{IP: group}) if err != nil { log.Fatal(err) } newgroup := net.IPv4(224, 0, 0, 249) err = p.JoinGroup(en1, &net.UDPAddr{IP: newgroup}) if err != nil { log.Fatal(err) } } type OSPFHeader struct { Version byte Type byte Len uint16 RouterID uint32 AreaID uint32 Checksum uint16 } const ( OSPFHeaderLen = 14 OSPFHelloHeaderLen = 20 OSPF_VERSION = 2 OSPF_TYPE_HELLO = iota + 1 OSPF_TYPE_DB_DESCRIPTION OSPF_TYPE_LS_REQUEST OSPF_TYPE_LS_UPDATE OSPF_TYPE_LS_ACK ) var ( AllSPFRouters = net.IPv4(224, 0, 0, 5) AllDRouters = net.IPv4(224, 0, 0, 6) ) func ExampleIPOSPFListener() { var ifs []*net.Interface en0, err := net.InterfaceByName("en0") if err != nil { log.Fatal(err) } ifs = append(ifs, en0) en1, err := net.InterfaceByIndex(911) if err != nil { log.Fatal(err) } ifs = append(ifs, en1) c, err := net.ListenPacket("ip4:89", "0.0.0.0") // OSFP for IPv4 if err != nil { log.Fatal(err) } defer c.Close() r, err := ipv4.NewRawConn(c) if err != nil { log.Fatal(err) } for _, ifi := range ifs { err := r.JoinGroup(ifi, &net.IPAddr{IP: AllSPFRouters}) if err != nil { log.Fatal(err) } err = r.JoinGroup(ifi, &net.IPAddr{IP: AllDRouters}) if err != nil { log.Fatal(err) } } err = r.SetControlMessage(ipv4.FlagDst|ipv4.FlagInterface, true) if err != nil { log.Fatal(err) } r.SetTOS(DiffServCS6) parseOSPFHeader := func(b []byte) *OSPFHeader { if len(b) < OSPFHeaderLen { return nil } return &OSPFHeader{ Version: b[0], Type: b[1], Len: uint16(b[2])<<8 | uint16(b[3]), RouterID: uint32(b[4])<<24 | uint32(b[5])<<16 | uint32(b[6])<<8 | uint32(b[7]), AreaID: uint32(b[8])<<24 | uint32(b[9])<<16 | uint32(b[10])<<8 | uint32(b[11]), Checksum: uint16(b[12])<<8 | uint16(b[13]), } } b := make([]byte, 1500) for { iph, p, _, err := r.ReadFrom(b) if err != nil { log.Fatal(err) } if iph.Version != ipv4.Version { continue } if iph.Dst.IsMulticast() { if !iph.Dst.Equal(AllSPFRouters) && !iph.Dst.Equal(AllDRouters) { continue } } ospfh := parseOSPFHeader(p) if ospfh == nil { continue } if ospfh.Version != OSPF_VERSION { continue } switch ospfh.Type { case OSPF_TYPE_HELLO: case OSPF_TYPE_DB_DESCRIPTION: case OSPF_TYPE_LS_REQUEST: case OSPF_TYPE_LS_UPDATE: case OSPF_TYPE_LS_ACK: } } } func ExampleWriteIPOSPFHello() { var ifs []*net.Interface en0, err := net.InterfaceByName("en0") if err != nil { log.Fatal(err) } ifs = append(ifs, en0) en1, err := net.InterfaceByIndex(911) if err != nil { log.Fatal(err) } ifs = append(ifs, en1) c, err := net.ListenPacket("ip4:89", "0.0.0.0") // OSPF for IPv4 if err != nil { log.Fatal(err) } defer c.Close() r, err := ipv4.NewRawConn(c) if err != nil { log.Fatal(err) } for _, ifi := range ifs { err := r.JoinGroup(ifi, &net.IPAddr{IP: AllSPFRouters}) if err != nil { log.Fatal(err) } err = r.JoinGroup(ifi, &net.IPAddr{IP: AllDRouters}) if err != nil { log.Fatal(err) } } hello := make([]byte, OSPFHelloHeaderLen) ospf := make([]byte, OSPFHeaderLen) ospf[0] = OSPF_VERSION ospf[1] = OSPF_TYPE_HELLO ospf = append(ospf, hello...) iph := &ipv4.Header{} iph.Version = ipv4.Version iph.Len = ipv4.HeaderLen iph.TOS = DiffServCS6 iph.TotalLen = ipv4.HeaderLen + len(ospf) iph.TTL = 1 iph.Protocol = 89 iph.Dst = AllSPFRouters for _, ifi := range ifs { err := r.SetMulticastInterface(ifi) if err != nil { return } err = r.WriteTo(iph, ospf, nil) if err != nil { return } } } go.net/ipv4/sockopt_linux.go0000644000175100017510000000567512235217213015451 0ustar spirospiro// 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. package ipv4 import ( "net" "os" "syscall" ) func ipv4ReceiveTOS(fd int) (bool, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVTOS) if err != nil { return false, os.NewSyscallError("getsockopt", err) } return v == 1, nil } func setIPv4ReceiveTOS(fd int, v bool) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVTOS, boolint(v))) } func ipv4MulticastTTL(fd int) (int, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL) if err != nil { return 0, os.NewSyscallError("getsockopt", err) } return v, nil } func setIPv4MulticastTTL(fd int, v int) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL, v)) } func ipv4PacketInfo(fd int) (bool, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_PKTINFO) if err != nil { return false, os.NewSyscallError("getsockopt", err) } return v == 1, nil } func setIPv4PacketInfo(fd int, v bool) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_PKTINFO, boolint(v))) } func ipv4MulticastInterface(fd int) (*net.Interface, error) { mreqn, err := syscall.GetsockoptIPMreqn(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF) if err != nil { return nil, os.NewSyscallError("getsockopt", err) } if int(mreqn.Ifindex) == 0 { return nil, nil } return net.InterfaceByIndex(int(mreqn.Ifindex)) } func setIPv4MulticastInterface(fd int, ifi *net.Interface) error { mreqn := syscall.IPMreqn{} if ifi != nil { mreqn.Ifindex = int32(ifi.Index) } return os.NewSyscallError("setsockopt", syscall.SetsockoptIPMreqn(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF, &mreqn)) } func ipv4MulticastLoopback(fd int) (bool, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP) if err != nil { return false, os.NewSyscallError("getsockopt", err) } return v == 1, nil } func setIPv4MulticastLoopback(fd int, v bool) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP, boolint(v))) } func joinIPv4Group(fd int, ifi *net.Interface, grp net.IP) error { mreqn := syscall.IPMreqn{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}} if ifi != nil { mreqn.Ifindex = int32(ifi.Index) } return os.NewSyscallError("setsockopt", syscall.SetsockoptIPMreqn(fd, ianaProtocolIP, syscall.IP_ADD_MEMBERSHIP, &mreqn)) } func leaveIPv4Group(fd int, ifi *net.Interface, grp net.IP) error { mreqn := syscall.IPMreqn{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}} if ifi != nil { mreqn.Ifindex = int32(ifi.Index) } return os.NewSyscallError("setsockopt", syscall.SetsockoptIPMreqn(fd, ianaProtocolIP, syscall.IP_DROP_MEMBERSHIP, &mreqn)) } go.net/html/0000755000175100017510000000000012235217213012266 5ustar spirospirogo.net/html/render_test.go0000644000175100017510000000544512235217213015143 0ustar spirospiro// Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package html import ( "bytes" "testing" ) func TestRenderer(t *testing.T) { nodes := [...]*Node{ 0: { Type: ElementNode, Data: "html", }, 1: { Type: ElementNode, Data: "head", }, 2: { Type: ElementNode, Data: "body", }, 3: { Type: TextNode, Data: "0<1", }, 4: { Type: ElementNode, Data: "p", Attr: []Attribute{ { Key: "id", Val: "A", }, { Key: "foo", Val: `abc"def`, }, }, }, 5: { Type: TextNode, Data: "2", }, 6: { Type: ElementNode, Data: "b", Attr: []Attribute{ { Key: "empty", Val: "", }, }, }, 7: { Type: TextNode, Data: "3", }, 8: { Type: ElementNode, Data: "i", Attr: []Attribute{ { Key: "backslash", Val: `\`, }, }, }, 9: { Type: TextNode, Data: "&4", }, 10: { Type: TextNode, Data: "5", }, 11: { Type: ElementNode, Data: "blockquote", }, 12: { Type: ElementNode, Data: "br", }, 13: { Type: TextNode, Data: "6", }, } // Build a tree out of those nodes, based on a textual representation. // Only the ".\t"s are significant. The trailing HTML-like text is // just commentary. The "0:" prefixes are for easy cross-reference with // the nodes array. treeAsText := [...]string{ 0: ``, 1: `. `, 2: `. `, 3: `. . "0<1"`, 4: `. .

`, 5: `. . . "2"`, 6: `. . . `, 7: `. . . . "3"`, 8: `. . . `, 9: `. . . . "&4"`, 10: `. . "5"`, 11: `. .

`, 12: `. .
`, 13: `. . "6"`, } if len(nodes) != len(treeAsText) { t.Fatal("len(nodes) != len(treeAsText)") } var stack [8]*Node for i, line := range treeAsText { level := 0 for line[0] == '.' { // Strip a leading ".\t". line = line[2:] level++ } n := nodes[i] if level == 0 { if stack[0] != nil { t.Fatal("multiple root nodes") } stack[0] = n } else { stack[level-1].AppendChild(n) stack[level] = n for i := level + 1; i < len(stack); i++ { stack[i] = nil } } // At each stage of tree construction, we check all nodes for consistency. for j, m := range nodes { if err := checkNodeConsistency(m); err != nil { t.Fatalf("i=%d, j=%d: %v", i, j, err) } } } want := `0<1

` + `23&4

` + `5

6` b := new(bytes.Buffer) if err := Render(b, nodes[0]); err != nil { t.Fatal(err) } if got := b.String(); got != want { t.Errorf("got vs want:\n%s\n%s\n", got, want) } } go.net/html/doctype.go0000644000175100017510000001147512235217213014274 0ustar spirospiro// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package html import ( "strings" ) // parseDoctype parses the data from a DoctypeToken into a name, // public identifier, and system identifier. It returns a Node whose Type // is DoctypeNode, whose Data is the name, and which has attributes // named "system" and "public" for the two identifiers if they were present. // quirks is whether the document should be parsed in "quirks mode". func parseDoctype(s string) (n *Node, quirks bool) { n = &Node{Type: DoctypeNode} // Find the name. space := strings.IndexAny(s, whitespace) if space == -1 { space = len(s) } n.Data = s[:space] // The comparison to "html" is case-sensitive. if n.Data != "html" { quirks = true } n.Data = strings.ToLower(n.Data) s = strings.TrimLeft(s[space:], whitespace) if len(s) < 6 { // It can't start with "PUBLIC" or "SYSTEM". // Ignore the rest of the string. return n, quirks || s != "" } key := strings.ToLower(s[:6]) s = s[6:] for key == "public" || key == "system" { s = strings.TrimLeft(s, whitespace) if s == "" { break } quote := s[0] if quote != '"' && quote != '\'' { break } s = s[1:] q := strings.IndexRune(s, rune(quote)) var id string if q == -1 { id = s s = "" } else { id = s[:q] s = s[q+1:] } n.Attr = append(n.Attr, Attribute{Key: key, Val: id}) if key == "public" { key = "system" } else { key = "" } } if key != "" || s != "" { quirks = true } else if len(n.Attr) > 0 { if n.Attr[0].Key == "public" { public := strings.ToLower(n.Attr[0].Val) switch public { case "-//w3o//dtd w3 html strict 3.0//en//", "-/w3d/dtd html 4.0 transitional/en", "html": quirks = true default: for _, q := range quirkyIDs { if strings.HasPrefix(public, q) { quirks = true break } } } // The following two public IDs only cause quirks mode if there is no system ID. if len(n.Attr) == 1 && (strings.HasPrefix(public, "-//w3c//dtd html 4.01 frameset//") || strings.HasPrefix(public, "-//w3c//dtd html 4.01 transitional//")) { quirks = true } } if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { quirks = true } } return n, quirks } // quirkyIDs is a list of public doctype identifiers that cause a document // to be interpreted in quirks mode. The identifiers should be in lower case. var quirkyIDs = []string{ "+//silmaril//dtd html pro v0r11 19970101//", "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", "-//as//dtd html 3.0 aswedit + extensions//", "-//ietf//dtd html 2.0 level 1//", "-//ietf//dtd html 2.0 level 2//", "-//ietf//dtd html 2.0 strict level 1//", "-//ietf//dtd html 2.0 strict level 2//", "-//ietf//dtd html 2.0 strict//", "-//ietf//dtd html 2.0//", "-//ietf//dtd html 2.1e//", "-//ietf//dtd html 3.0//", "-//ietf//dtd html 3.2 final//", "-//ietf//dtd html 3.2//", "-//ietf//dtd html 3//", "-//ietf//dtd html level 0//", "-//ietf//dtd html level 1//", "-//ietf//dtd html level 2//", "-//ietf//dtd html level 3//", "-//ietf//dtd html strict level 0//", "-//ietf//dtd html strict level 1//", "-//ietf//dtd html strict level 2//", "-//ietf//dtd html strict level 3//", "-//ietf//dtd html strict//", "-//ietf//dtd html//", "-//metrius//dtd metrius presentational//", "-//microsoft//dtd internet explorer 2.0 html strict//", "-//microsoft//dtd internet explorer 2.0 html//", "-//microsoft//dtd internet explorer 2.0 tables//", "-//microsoft//dtd internet explorer 3.0 html strict//", "-//microsoft//dtd internet explorer 3.0 html//", "-//microsoft//dtd internet explorer 3.0 tables//", "-//netscape comm. corp.//dtd html//", "-//netscape comm. corp.//dtd strict html//", "-//o'reilly and associates//dtd html 2.0//", "-//o'reilly and associates//dtd html extended 1.0//", "-//o'reilly and associates//dtd html extended relaxed 1.0//", "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", "-//spyglass//dtd html 2.0 extended//", "-//sq//dtd html 2.0 hotmetal + extensions//", "-//sun microsystems corp.//dtd hotjava html//", "-//sun microsystems corp.//dtd hotjava strict html//", "-//w3c//dtd html 3 1995-03-24//", "-//w3c//dtd html 3.2 draft//", "-//w3c//dtd html 3.2 final//", "-//w3c//dtd html 3.2//", "-//w3c//dtd html 3.2s draft//", "-//w3c//dtd html 4.0 frameset//", "-//w3c//dtd html 4.0 transitional//", "-//w3c//dtd html experimental 19960712//", "-//w3c//dtd html experimental 970421//", "-//w3c//dtd w3 html//", "-//w3o//dtd w3 html 3.0//", "-//webtechs//dtd mozilla html 2.0//", "-//webtechs//dtd mozilla html//", } go.net/html/const.go0000644000175100017510000000441212235217213013744 0ustar spirospiro// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package html // Section 12.2.3.2 of the HTML5 specification says "The following elements // have varying levels of special parsing rules". // http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#the-stack-of-open-elements var isSpecialElementMap = map[string]bool{ "address": true, "applet": true, "area": true, "article": true, "aside": true, "base": true, "basefont": true, "bgsound": true, "blockquote": true, "body": true, "br": true, "button": true, "caption": true, "center": true, "col": true, "colgroup": true, "command": true, "dd": true, "details": true, "dir": true, "div": true, "dl": true, "dt": true, "embed": true, "fieldset": true, "figcaption": true, "figure": true, "footer": true, "form": true, "frame": true, "frameset": true, "h1": true, "h2": true, "h3": true, "h4": true, "h5": true, "h6": true, "head": true, "header": true, "hgroup": true, "hr": true, "html": true, "iframe": true, "img": true, "input": true, "isindex": true, "li": true, "link": true, "listing": true, "marquee": true, "menu": true, "meta": true, "nav": true, "noembed": true, "noframes": true, "noscript": true, "object": true, "ol": true, "p": true, "param": true, "plaintext": true, "pre": true, "script": true, "section": true, "select": true, "style": true, "summary": true, "table": true, "tbody": true, "td": true, "textarea": true, "tfoot": true, "th": true, "thead": true, "title": true, "tr": true, "ul": true, "wbr": true, "xmp": true, } func isSpecialElement(element *Node) bool { switch element.Namespace { case "", "html": return isSpecialElementMap[element.Data] case "svg": return element.Data == "foreignObject" } return false } go.net/html/render.go0000644000175100017510000001570012235217213014077 0ustar spirospiro// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package html import ( "bufio" "errors" "fmt" "io" "strings" ) type writer interface { io.Writer WriteByte(c byte) error // in Go 1.1, use io.ByteWriter WriteString(string) (int, error) } // Render renders the parse tree n to the given writer. // // Rendering is done on a 'best effort' basis: calling Parse on the output of // Render will always result in something similar to the original tree, but it // is not necessarily an exact clone unless the original tree was 'well-formed'. // 'Well-formed' is not easily specified; the HTML5 specification is // complicated. // // Calling Parse on arbitrary input typically results in a 'well-formed' parse // tree. However, it is possible for Parse to yield a 'badly-formed' parse tree. // For example, in a 'well-formed' parse tree, no element is a child of // another element: parsing "" results in two sibling elements. // Similarly, in a 'well-formed' parse tree, no element is a child of a // element: parsing "

" results in a

with two sibling // children; the is reparented to the

's parent. However, calling // Parse on "
" does not return an error, but the result has an // element with an child, and is therefore not 'well-formed'. // // Programmatically constructed trees are typically also 'well-formed', but it // is possible to construct a tree that looks innocuous but, when rendered and // re-parsed, results in a different tree. A simple example is that a solitary // text node would become a tree containing , and elements. // Another example is that the programmatic equivalent of "abc" // becomes "abc". func Render(w io.Writer, n *Node) error { if x, ok := w.(writer); ok { return render(x, n) } buf := bufio.NewWriter(w) if err := render(buf, n); err != nil { return err } return buf.Flush() } // plaintextAbort is returned from render1 when a element // has been rendered. No more end tags should be rendered after that. var plaintextAbort = errors.New("html: internal error (plaintext abort)") func render(w writer, n *Node) error { err := render1(w, n) if err == plaintextAbort { err = nil } return err } func render1(w writer, n *Node) error { // Render non-element nodes; these are the easy cases. switch n.Type { case ErrorNode: return errors.New("html: cannot render an ErrorNode node") case TextNode: return escape(w, n.Data) case DocumentNode: for c := n.FirstChild; c != nil; c = c.NextSibling { if err := render1(w, c); err != nil { return err } } return nil case ElementNode: // No-op. case CommentNode: if _, err := w.WriteString("<!--"); err != nil { return err } if _, err := w.WriteString(n.Data); err != nil { return err } if _, err := w.WriteString("-->"); err != nil { return err } return nil case DoctypeNode: if _, err := w.WriteString("<!DOCTYPE "); err != nil { return err } if _, err := w.WriteString(n.Data); err != nil { return err } if n.Attr != nil { var p, s string for _, a := range n.Attr { switch a.Key { case "public": p = a.Val case "system": s = a.Val } } if p != "" { if _, err := w.WriteString(" PUBLIC "); err != nil { return err } if err := writeQuoted(w, p); err != nil { return err } if s != "" { if err := w.WriteByte(' '); err != nil { return err } if err := writeQuoted(w, s); err != nil { return err } } } else if s != "" { if _, err := w.WriteString(" SYSTEM "); err != nil { return err } if err := writeQuoted(w, s); err != nil { return err } } } return w.WriteByte('>') default: return errors.New("html: unknown node type") } // Render the <xxx> opening tag. if err := w.WriteByte('<'); err != nil { return err } if _, err := w.WriteString(n.Data); err != nil { return err } for _, a := range n.Attr { if err := w.WriteByte(' '); err != nil { return err } if a.Namespace != "" { if _, err := w.WriteString(a.Namespace); err != nil { return err } if err := w.WriteByte(':'); err != nil { return err } } if _, err := w.WriteString(a.Key); err != nil { return err } if _, err := w.WriteString(`="`); err != nil { return err } if err := escape(w, a.Val); err != nil { return err } if err := w.WriteByte('"'); err != nil { return err } } if voidElements[n.Data] { if n.FirstChild != nil { return fmt.Errorf("html: void element <%s> has child nodes", n.Data) } _, err := w.WriteString("/>") return err } if err := w.WriteByte('>'); err != nil { return err } // Add initial newline where there is danger of a newline beging ignored. if c := n.FirstChild; c != nil && c.Type == TextNode && strings.HasPrefix(c.Data, "\n") { switch n.Data { case "pre", "listing", "textarea": if err := w.WriteByte('\n'); err != nil { return err } } } // Render any child nodes. switch n.Data { case "iframe", "noembed", "noframes", "noscript", "plaintext", "script", "style", "xmp": for c := n.FirstChild; c != nil; c = c.NextSibling { if c.Type == TextNode { if _, err := w.WriteString(c.Data); err != nil { return err } } else { if err := render1(w, c); err != nil { return err } } } if n.Data == "plaintext" { // Don't render anything else. <plaintext> must be the // last element in the file, with no closing tag. return plaintextAbort } default: for c := n.FirstChild; c != nil; c = c.NextSibling { if err := render1(w, c); err != nil { return err } } } // Render the </xxx> closing tag. if _, err := w.WriteString("</"); err != nil { return err } if _, err := w.WriteString(n.Data); err != nil { return err } return w.WriteByte('>') } // writeQuoted writes s to w surrounded by quotes. Normally it will use double // quotes, but if s contains a double quote, it will use single quotes. // It is used for writing the identifiers in a doctype declaration. // In valid HTML, they can't contain both types of quotes. func writeQuoted(w writer, s string) error { var q byte = '"' if strings.Contains(s, `"`) { q = '\'' } if err := w.WriteByte(q); err != nil { return err } if _, err := w.WriteString(s); err != nil { return err } if err := w.WriteByte(q); err != nil { return err } return nil } // Section 12.1.2, "Elements", gives this list of void elements. Void elements // are those that can't have any contents. var voidElements = map[string]bool{ "area": true, "base": true, "br": true, "col": true, "command": true, "embed": true, "hr": true, "img": true, "input": true, "keygen": true, "link": true, "meta": true, "param": true, "source": true, "track": true, "wbr": true, } ����������������������������������������������������������������go.net/html/token_test.go���������������������������������������������������������������������������0000644�0001751�0001751�00000027756�12235217213�015015� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package html import ( "bytes" "io" "io/ioutil" "reflect" "runtime" "strings" "testing" ) type tokenTest struct { // A short description of the test case. desc string // The HTML to parse. html string // The string representations of the expected tokens, joined by '$'. golden string } var tokenTests = []tokenTest{ { "empty", "", "", }, // A single text node. The tokenizer should not break text nodes on whitespace, // nor should it normalize whitespace within a text node. { "text", "foo bar", "foo bar", }, // An entity. { "entity", "one &lt; two", "one &lt; two", }, // A start, self-closing and end tag. The tokenizer does not care if the start // and end tokens don't match; that is the job of the parser. { "tags", "<a>b<c/>d</e>", "<a>$b$<c/>$d$</e>", }, // Angle brackets that aren't a tag. { "not a tag #0", "<", "&lt;", }, { "not a tag #1", "</", "&lt;/", }, { "not a tag #2", "</>", "", }, { "not a tag #3", "a</>b", "a$b", }, { "not a tag #4", "</ >", "<!-- -->", }, { "not a tag #5", "</.", "<!--.-->", }, { "not a tag #6", "</.>", "<!--.-->", }, { "not a tag #7", "a < b", "a &lt; b", }, { "not a tag #8", "<.>", "&lt;.&gt;", }, { "not a tag #9", "a<<<b>>>c", "a&lt;&lt;$<b>$&gt;&gt;c", }, { "not a tag #10", "if x<0 and y < 0 then x*y>0", "if x&lt;0 and y &lt; 0 then x*y&gt;0", }, // EOF in a tag name. { "tag name eof #0", "<a", "", }, { "tag name eof #1", "<a ", "", }, { "tag name eof #2", "a<b", "a", }, { "tag name eof #3", "<a><b", "<a>", }, { "tag name eof #4", `<a x`, ``, }, // Some malformed tags that are missing a '>'. { "malformed tag #0", `<p</p>`, `<p< p="">`, }, { "malformed tag #1", `<p </p>`, `<p <="" p="">`, }, { "malformed tag #2", `<p id`, ``, }, { "malformed tag #3", `<p id=`, ``, }, { "malformed tag #4", `<p id=>`, `<p id="">`, }, { "malformed tag #5", `<p id=0`, ``, }, { "malformed tag #6", `<p id=0</p>`, `<p id="0&lt;/p">`, }, { "malformed tag #7", `<p id="0</p>`, ``, }, { "malformed tag #8", `<p id="0"</p>`, `<p id="0" <="" p="">`, }, { "malformed tag #9", `<p></p id`, `<p>`, }, // Raw text and RCDATA. { "basic raw text", "<script><a></b></script>", "<script>$&lt;a&gt;&lt;/b&gt;$</script>", }, { "unfinished script end tag", "<SCRIPT>a</SCR", "<script>$a&lt;/SCR", }, { "broken script end tag", "<SCRIPT>a</SCR ipt>", "<script>$a&lt;/SCR ipt&gt;", }, { "EOF in script end tag", "<SCRIPT>a</SCRipt", "<script>$a&lt;/SCRipt", }, { "scriptx end tag", "<SCRIPT>a</SCRiptx", "<script>$a&lt;/SCRiptx", }, { "' ' completes script end tag", "<SCRIPT>a</SCRipt ", "<script>$a", }, { "'>' completes script end tag", "<SCRIPT>a</SCRipt>", "<script>$a$</script>", }, { "self-closing script end tag", "<SCRIPT>a</SCRipt/>", "<script>$a$</script>", }, { "nested script tag", "<SCRIPT>a</SCRipt<script>", "<script>$a&lt;/SCRipt&lt;script&gt;", }, { "script end tag after unfinished", "<SCRIPT>a</SCRipt</script>", "<script>$a&lt;/SCRipt$</script>", }, { "script/style mismatched tags", "<script>a</style>", "<script>$a&lt;/style&gt;", }, { "style element with entity", "<style>&apos;", "<style>$&amp;apos;", }, { "textarea with tag", "<textarea><div></textarea>", "<textarea>$&lt;div&gt;$</textarea>", }, { "title with tag and entity", "<title><b>K&amp;R C</b></title>", "<title>$&lt;b&gt;K&amp;R C&lt;/b&gt;$</title>", }, // DOCTYPE tests. { "Proper DOCTYPE", "<!DOCTYPE html>", "<!DOCTYPE html>", }, { "DOCTYPE with no space", "<!doctypehtml>", "<!DOCTYPE html>", }, { "DOCTYPE with two spaces", "<!doctype html>", "<!DOCTYPE html>", }, { "looks like DOCTYPE but isn't", "<!DOCUMENT html>", "<!--DOCUMENT html-->", }, { "DOCTYPE at EOF", "<!DOCtype", "<!DOCTYPE >", }, // XML processing instructions. { "XML processing instruction", "<?xml?>", "<!--?xml?-->", }, // Comments. { "comment0", "abc<b><!-- skipme --></b>def", "abc$<b>$<!-- skipme -->$</b>$def", }, { "comment1", "a<!-->z", "a$<!---->$z", }, { "comment2", "a<!--->z", "a$<!---->$z", }, { "comment3", "a<!--x>-->z", "a$<!--x>-->$z", }, { "comment4", "a<!--x->-->z", "a$<!--x->-->$z", }, { "comment5", "a<!>z", "a$<!---->$z", }, { "comment6", "a<!->z", "a$<!----->$z", }, { "comment7", "a<!---<>z", "a$<!---<>z-->", }, { "comment8", "a<!--z", "a$<!--z-->", }, { "comment9", "a<!--z-", "a$<!--z-->", }, { "comment10", "a<!--z--", "a$<!--z-->", }, { "comment11", "a<!--z---", "a$<!--z--->", }, { "comment12", "a<!--z----", "a$<!--z---->", }, { "comment13", "a<!--x--!>z", "a$<!--x-->$z", }, // An attribute with a backslash. { "backslash", `<p id="a\"b">`, `<p id="a\" b"="">`, }, // Entities, tag name and attribute key lower-casing, and whitespace // normalization within a tag. { "tricky", "<p \t\n iD=\"a&quot;B\" foo=\"bar\"><EM>te&lt;&amp;;xt</em></p>", `<p id="a&#34;B" foo="bar">$<em>$te&lt;&amp;;xt$</em>$</p>`, }, // A nonexistent entity. Tokenizing and converting back to a string should // escape the "&" to become "&amp;". { "noSuchEntity", `<a b="c&noSuchEntity;d">&lt;&alsoDoesntExist;&`, `<a b="c&amp;noSuchEntity;d">$&lt;&amp;alsoDoesntExist;&amp;`, }, { "entity without semicolon", `&notit;&notin;<a b="q=z&amp=5&notice=hello&not;=world">`, `¬it;∉$<a b="q=z&amp;amp=5&amp;notice=hello¬=world">`, }, { "entity with digits", "&frac12;", "½", }, // Attribute tests: // http://dev.w3.org/html5/spec/Overview.html#attributes-0 { "Empty attribute", `<input disabled FOO>`, `<input disabled="" foo="">`, }, { "Empty attribute, whitespace", `<input disabled FOO >`, `<input disabled="" foo="">`, }, { "Unquoted attribute value", `<input value=yes FOO=BAR>`, `<input value="yes" foo="BAR">`, }, { "Unquoted attribute value, spaces", `<input value = yes FOO = BAR>`, `<input value="yes" foo="BAR">`, }, { "Unquoted attribute value, trailing space", `<input value=yes FOO=BAR >`, `<input value="yes" foo="BAR">`, }, { "Single-quoted attribute value", `<input value='yes' FOO='BAR'>`, `<input value="yes" foo="BAR">`, }, { "Single-quoted attribute value, trailing space", `<input value='yes' FOO='BAR' >`, `<input value="yes" foo="BAR">`, }, { "Double-quoted attribute value", `<input value="I'm an attribute" FOO="BAR">`, `<input value="I&#39;m an attribute" foo="BAR">`, }, { "Attribute name characters", `<meta http-equiv="content-type">`, `<meta http-equiv="content-type">`, }, { "Mixed attributes", `a<P V="0 1" w='2' X=3 y>z`, `a$<p v="0 1" w="2" x="3" y="">$z`, }, { "Attributes with a solitary single quote", `<p id=can't><p id=won't>`, `<p id="can&#39;t">$<p id="won&#39;t">`, }, } func TestTokenizer(t *testing.T) { loop: for _, tt := range tokenTests { z := NewTokenizer(strings.NewReader(tt.html)) if tt.golden != "" { for i, s := range strings.Split(tt.golden, "$") { if z.Next() == ErrorToken { t.Errorf("%s token %d: want %q got error %v", tt.desc, i, s, z.Err()) continue loop } actual := z.Token().String() if s != actual { t.Errorf("%s token %d: want %q got %q", tt.desc, i, s, actual) continue loop } } } z.Next() if z.Err() != io.EOF { t.Errorf("%s: want EOF got %q", tt.desc, z.Err()) } } } func TestBufAPI(t *testing.T) { s := "0<a>1</a>2<b>3<a>4<a>5</a>6</b>7</a>8<a/>9" z := NewTokenizer(bytes.NewBufferString(s)) var result bytes.Buffer depth := 0 loop: for { tt := z.Next() switch tt { case ErrorToken: if z.Err() != io.EOF { t.Error(z.Err()) } break loop case TextToken: if depth > 0 { result.Write(z.Text()) } case StartTagToken, EndTagToken: tn, _ := z.TagName() if len(tn) == 1 && tn[0] == 'a' { if tt == StartTagToken { depth++ } else { depth-- } } } } u := "14567" v := string(result.Bytes()) if u != v { t.Errorf("TestBufAPI: want %q got %q", u, v) } } func TestConvertNewlines(t *testing.T) { testCases := map[string]string{ "Mac\rDOS\r\nUnix\n": "Mac\nDOS\nUnix\n", "Unix\nMac\rDOS\r\n": "Unix\nMac\nDOS\n", "DOS\r\nDOS\r\nDOS\r\n": "DOS\nDOS\nDOS\n", "": "", "\n": "\n", "\n\r": "\n\n", "\r": "\n", "\r\n": "\n", "\r\n\n": "\n\n", "\r\n\r": "\n\n", "\r\n\r\n": "\n\n", "\r\r": "\n\n", "\r\r\n": "\n\n", "\r\r\n\n": "\n\n\n", "\r\r\r\n": "\n\n\n", "\r \n": "\n \n", "xyz": "xyz", } for in, want := range testCases { if got := string(convertNewlines([]byte(in))); got != want { t.Errorf("input %q: got %q, want %q", in, got, want) } } } func TestReaderEdgeCases(t *testing.T) { const s = "<p>An io.Reader can return (0, nil) or (n, io.EOF).</p>" testCases := []io.Reader{ &zeroOneByteReader{s: s}, &eofStringsReader{s: s}, &stuckReader{}, } for i, tc := range testCases { got := []TokenType{} z := NewTokenizer(tc) for { tt := z.Next() if tt == ErrorToken { break } got = append(got, tt) } if err := z.Err(); err != nil && err != io.EOF { if err != io.ErrNoProgress { t.Errorf("i=%d: %v", i, err) } continue } want := []TokenType{ StartTagToken, TextToken, EndTagToken, } if !reflect.DeepEqual(got, want) { t.Errorf("i=%d: got %v, want %v", i, got, want) continue } } } // zeroOneByteReader is like a strings.Reader that alternates between // returning 0 bytes and 1 byte at a time. type zeroOneByteReader struct { s string n int } func (r *zeroOneByteReader) Read(p []byte) (int, error) { if len(p) == 0 { return 0, nil } if len(r.s) == 0 { return 0, io.EOF } r.n++ if r.n%2 != 0 { return 0, nil } p[0], r.s = r.s[0], r.s[1:] return 1, nil } // eofStringsReader is like a strings.Reader but can return an (n, err) where // n > 0 && err != nil. type eofStringsReader struct { s string } func (r *eofStringsReader) Read(p []byte) (int, error) { n := copy(p, r.s) r.s = r.s[n:] if r.s != "" { return n, nil } return n, io.EOF } // stuckReader is an io.Reader that always returns no data and no error. type stuckReader struct{} func (*stuckReader) Read(p []byte) (int, error) { return 0, nil } const ( rawLevel = iota lowLevel highLevel ) func benchmarkTokenizer(b *testing.B, level int) { buf, err := ioutil.ReadFile("testdata/go1.html") if err != nil { b.Fatalf("could not read testdata/go1.html: %v", err) } b.SetBytes(int64(len(buf))) runtime.GC() b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { z := NewTokenizer(bytes.NewBuffer(buf)) for { tt := z.Next() if tt == ErrorToken { if err := z.Err(); err != nil && err != io.EOF { b.Fatalf("tokenizer error: %v", err) } break } switch level { case rawLevel: // Calling z.Raw just returns the raw bytes of the token. It does // not unescape &lt; to <, or lower-case tag names and attribute keys. z.Raw() case lowLevel: // Caling z.Text, z.TagName and z.TagAttr returns []byte values // whose contents may change on the next call to z.Next. switch tt { case TextToken, CommentToken, DoctypeToken: z.Text() case StartTagToken, SelfClosingTagToken: _, more := z.TagName() for more { _, _, more = z.TagAttr() } case EndTagToken: z.TagName() } case highLevel: // Calling z.Token converts []byte values to strings whose validity // extend beyond the next call to z.Next. z.Token() } } } } func BenchmarkRawLevelTokenizer(b *testing.B) { benchmarkTokenizer(b, rawLevel) } func BenchmarkLowLevelTokenizer(b *testing.B) { benchmarkTokenizer(b, lowLevel) } func BenchmarkHighLevelTokenizer(b *testing.B) { benchmarkTokenizer(b, highLevel) } ������������������go.net/html/parse_test.go���������������������������������������������������������������������������0000644�0001751�0001751�00000023645�12235217213�015000� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package html import ( "bufio" "bytes" "errors" "fmt" "io" "io/ioutil" "os" "path/filepath" "runtime" "sort" "strings" "testing" "code.google.com/p/go.net/html/atom" ) // readParseTest reads a single test case from r. func readParseTest(r *bufio.Reader) (text, want, context string, err error) { line, err := r.ReadSlice('\n') if err != nil { return "", "", "", err } var b []byte // Read the HTML. if string(line) != "#data\n" { return "", "", "", fmt.Errorf(`got %q want "#data\n"`, line) } for { line, err = r.ReadSlice('\n') if err != nil { return "", "", "", err } if line[0] == '#' { break } b = append(b, line...) } text = strings.TrimSuffix(string(b), "\n") b = b[:0] // Skip the error list. if string(line) != "#errors\n" { return "", "", "", fmt.Errorf(`got %q want "#errors\n"`, line) } for { line, err = r.ReadSlice('\n') if err != nil { return "", "", "", err } if line[0] == '#' { break } } if string(line) == "#document-fragment\n" { line, err = r.ReadSlice('\n') if err != nil { return "", "", "", err } context = strings.TrimSpace(string(line)) line, err = r.ReadSlice('\n') if err != nil { return "", "", "", err } } // Read the dump of what the parse tree should be. if string(line) != "#document\n" { return "", "", "", fmt.Errorf(`got %q want "#document\n"`, line) } inQuote := false for { line, err = r.ReadSlice('\n') if err != nil && err != io.EOF { return "", "", "", err } trimmed := bytes.Trim(line, "| \n") if len(trimmed) > 0 { if line[0] == '|' && trimmed[0] == '"' { inQuote = true } if trimmed[len(trimmed)-1] == '"' && !(line[0] == '|' && len(trimmed) == 1) { inQuote = false } } if len(line) == 0 || len(line) == 1 && line[0] == '\n' && !inQuote { break } b = append(b, line...) } return text, string(b), context, nil } func dumpIndent(w io.Writer, level int) { io.WriteString(w, "| ") for i := 0; i < level; i++ { io.WriteString(w, " ") } } type sortedAttributes []Attribute func (a sortedAttributes) Len() int { return len(a) } func (a sortedAttributes) Less(i, j int) bool { if a[i].Namespace != a[j].Namespace { return a[i].Namespace < a[j].Namespace } return a[i].Key < a[j].Key } func (a sortedAttributes) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func dumpLevel(w io.Writer, n *Node, level int) error { dumpIndent(w, level) switch n.Type { case ErrorNode: return errors.New("unexpected ErrorNode") case DocumentNode: return errors.New("unexpected DocumentNode") case ElementNode: if n.Namespace != "" { fmt.Fprintf(w, "<%s %s>", n.Namespace, n.Data) } else { fmt.Fprintf(w, "<%s>", n.Data) } attr := sortedAttributes(n.Attr) sort.Sort(attr) for _, a := range attr { io.WriteString(w, "\n") dumpIndent(w, level+1) if a.Namespace != "" { fmt.Fprintf(w, `%s %s="%s"`, a.Namespace, a.Key, a.Val) } else { fmt.Fprintf(w, `%s="%s"`, a.Key, a.Val) } } case TextNode: fmt.Fprintf(w, `"%s"`, n.Data) case CommentNode: fmt.Fprintf(w, "<!-- %s -->", n.Data) case DoctypeNode: fmt.Fprintf(w, "<!DOCTYPE %s", n.Data) if n.Attr != nil { var p, s string for _, a := range n.Attr { switch a.Key { case "public": p = a.Val case "system": s = a.Val } } if p != "" || s != "" { fmt.Fprintf(w, ` "%s"`, p) fmt.Fprintf(w, ` "%s"`, s) } } io.WriteString(w, ">") case scopeMarkerNode: return errors.New("unexpected scopeMarkerNode") default: return errors.New("unknown node type") } io.WriteString(w, "\n") for c := n.FirstChild; c != nil; c = c.NextSibling { if err := dumpLevel(w, c, level+1); err != nil { return err } } return nil } func dump(n *Node) (string, error) { if n == nil || n.FirstChild == nil { return "", nil } var b bytes.Buffer for c := n.FirstChild; c != nil; c = c.NextSibling { if err := dumpLevel(&b, c, 0); err != nil { return "", err } } return b.String(), nil } const testDataDir = "testdata/webkit/" func TestParser(t *testing.T) { testFiles, err := filepath.Glob(testDataDir + "*.dat") if err != nil { t.Fatal(err) } for _, tf := range testFiles { f, err := os.Open(tf) if err != nil { t.Fatal(err) } defer f.Close() r := bufio.NewReader(f) for i := 0; ; i++ { text, want, context, err := readParseTest(r) if err == io.EOF { break } if err != nil { t.Fatal(err) } err = testParseCase(text, want, context) if err != nil { t.Errorf("%s test #%d %q, %s", tf, i, text, err) } } } } // testParseCase tests one test case from the test files. If the test does not // pass, it returns an error that explains the failure. // text is the HTML to be parsed, want is a dump of the correct parse tree, // and context is the name of the context node, if any. func testParseCase(text, want, context string) (err error) { defer func() { if x := recover(); x != nil { switch e := x.(type) { case error: err = e default: err = fmt.Errorf("%v", e) } } }() var doc *Node if context == "" { doc, err = Parse(strings.NewReader(text)) if err != nil { return err } } else { contextNode := &Node{ Type: ElementNode, DataAtom: atom.Lookup([]byte(context)), Data: context, } nodes, err := ParseFragment(strings.NewReader(text), contextNode) if err != nil { return err } doc = &Node{ Type: DocumentNode, } for _, n := range nodes { doc.AppendChild(n) } } if err := checkTreeConsistency(doc); err != nil { return err } got, err := dump(doc) if err != nil { return err } // Compare the parsed tree to the #document section. if got != want { return fmt.Errorf("got vs want:\n----\n%s----\n%s----", got, want) } if renderTestBlacklist[text] || context != "" { return nil } // Check that rendering and re-parsing results in an identical tree. pr, pw := io.Pipe() go func() { pw.CloseWithError(Render(pw, doc)) }() doc1, err := Parse(pr) if err != nil { return err } got1, err := dump(doc1) if err != nil { return err } if got != got1 { return fmt.Errorf("got vs got1:\n----\n%s----\n%s----", got, got1) } return nil } // Some test input result in parse trees are not 'well-formed' despite // following the HTML5 recovery algorithms. Rendering and re-parsing such a // tree will not result in an exact clone of that tree. We blacklist such // inputs from the render test. var renderTestBlacklist = map[string]bool{ // The second <a> will be reparented to the first <table>'s parent. This // results in an <a> whose parent is an <a>, which is not 'well-formed'. `<a><table><td><a><table></table><a></tr><a></table><b>X</b>C<a>Y`: true, // The same thing with a <p>: `<p><table></p>`: true, // More cases of <a> being reparented: `<a href="blah">aba<table><a href="foo">br<tr><td></td></tr>x</table>aoe`: true, `<a><table><a></table><p><a><div><a>`: true, `<a><table><td><a><table></table><a></tr><a></table><a>`: true, // A similar reparenting situation involving <nobr>: `<!DOCTYPE html><body><b><nobr>1<table><nobr></b><i><nobr>2<nobr></i>3`: true, // A <plaintext> element is reparented, putting it before a table. // A <plaintext> element can't have anything after it in HTML. `<table><plaintext><td>`: true, `<!doctype html><table><plaintext></plaintext>`: true, `<!doctype html><table><tbody><plaintext></plaintext>`: true, `<!doctype html><table><tbody><tr><plaintext></plaintext>`: true, // A form inside a table inside a form doesn't work either. `<!doctype html><form><table></form><form></table></form>`: true, // A script that ends at EOF may escape its own closing tag when rendered. `<!doctype html><script><!--<script `: true, `<!doctype html><script><!--<script <`: true, `<!doctype html><script><!--<script <a`: true, `<!doctype html><script><!--<script </`: true, `<!doctype html><script><!--<script </s`: true, `<!doctype html><script><!--<script </script`: true, `<!doctype html><script><!--<script </scripta`: true, `<!doctype html><script><!--<script -`: true, `<!doctype html><script><!--<script -a`: true, `<!doctype html><script><!--<script -<`: true, `<!doctype html><script><!--<script --`: true, `<!doctype html><script><!--<script --a`: true, `<!doctype html><script><!--<script --<`: true, `<script><!--<script `: true, `<script><!--<script <a`: true, `<script><!--<script </script`: true, `<script><!--<script </scripta`: true, `<script><!--<script -`: true, `<script><!--<script -a`: true, `<script><!--<script --`: true, `<script><!--<script --a`: true, `<script><!--<script <`: true, `<script><!--<script </`: true, `<script><!--<script </s`: true, // Reconstructing the active formatting elements results in a <plaintext> // element that contains an <a> element. `<!doctype html><p><a><plaintext>b`: true, } func TestNodeConsistency(t *testing.T) { // inconsistentNode is a Node whose DataAtom and Data do not agree. inconsistentNode := &Node{ Type: ElementNode, DataAtom: atom.Frameset, Data: "table", } _, err := ParseFragment(strings.NewReader("<p>hello</p>"), inconsistentNode) if err == nil { t.Errorf("got nil error, want non-nil") } } func BenchmarkParser(b *testing.B) { buf, err := ioutil.ReadFile("testdata/go1.html") if err != nil { b.Fatalf("could not read testdata/go1.html: %v", err) } b.SetBytes(int64(len(buf))) runtime.GC() b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { Parse(bytes.NewBuffer(buf)) } } �������������������������������������������������������������������������������������������go.net/html/entity.go�������������������������������������������������������������������������������0000644�0001751�0001751�00000303345�12235217213�014141� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package html // All entities that do not end with ';' are 6 or fewer bytes long. const longestEntityWithoutSemicolon = 6 // entity is a map from HTML entity names to their values. The semicolon matters: // http://www.whatwg.org/specs/web-apps/current-work/multipage/named-character-references.html // lists both "amp" and "amp;" as two separate entries. // // Note that the HTML5 list is larger than the HTML4 list at // http://www.w3.org/TR/html4/sgml/entities.html var entity = map[string]rune{ "AElig;": '\U000000C6', "AMP;": '\U00000026', "Aacute;": '\U000000C1', "Abreve;": '\U00000102', "Acirc;": '\U000000C2', "Acy;": '\U00000410', "Afr;": '\U0001D504', "Agrave;": '\U000000C0', "Alpha;": '\U00000391', "Amacr;": '\U00000100', "And;": '\U00002A53', "Aogon;": '\U00000104', "Aopf;": '\U0001D538', "ApplyFunction;": '\U00002061', "Aring;": '\U000000C5', "Ascr;": '\U0001D49C', "Assign;": '\U00002254', "Atilde;": '\U000000C3', "Auml;": '\U000000C4', "Backslash;": '\U00002216', "Barv;": '\U00002AE7', "Barwed;": '\U00002306', "Bcy;": '\U00000411', "Because;": '\U00002235', "Bernoullis;": '\U0000212C', "Beta;": '\U00000392', "Bfr;": '\U0001D505', "Bopf;": '\U0001D539', "Breve;": '\U000002D8', "Bscr;": '\U0000212C', "Bumpeq;": '\U0000224E', "CHcy;": '\U00000427', "COPY;": '\U000000A9', "Cacute;": '\U00000106', "Cap;": '\U000022D2', "CapitalDifferentialD;": '\U00002145', "Cayleys;": '\U0000212D', "Ccaron;": '\U0000010C', "Ccedil;": '\U000000C7', "Ccirc;": '\U00000108', "Cconint;": '\U00002230', "Cdot;": '\U0000010A', "Cedilla;": '\U000000B8', "CenterDot;": '\U000000B7', "Cfr;": '\U0000212D', "Chi;": '\U000003A7', "CircleDot;": '\U00002299', "CircleMinus;": '\U00002296', "CirclePlus;": '\U00002295', "CircleTimes;": '\U00002297', "ClockwiseContourIntegral;": '\U00002232', "CloseCurlyDoubleQuote;": '\U0000201D', "CloseCurlyQuote;": '\U00002019', "Colon;": '\U00002237', "Colone;": '\U00002A74', "Congruent;": '\U00002261', "Conint;": '\U0000222F', "ContourIntegral;": '\U0000222E', "Copf;": '\U00002102', "Coproduct;": '\U00002210', "CounterClockwiseContourIntegral;": '\U00002233', "Cross;": '\U00002A2F', "Cscr;": '\U0001D49E', "Cup;": '\U000022D3', "CupCap;": '\U0000224D', "DD;": '\U00002145', "DDotrahd;": '\U00002911', "DJcy;": '\U00000402', "DScy;": '\U00000405', "DZcy;": '\U0000040F', "Dagger;": '\U00002021', "Darr;": '\U000021A1', "Dashv;": '\U00002AE4', "Dcaron;": '\U0000010E', "Dcy;": '\U00000414', "Del;": '\U00002207', "Delta;": '\U00000394', "Dfr;": '\U0001D507', "DiacriticalAcute;": '\U000000B4', "DiacriticalDot;": '\U000002D9', "DiacriticalDoubleAcute;": '\U000002DD', "DiacriticalGrave;": '\U00000060', "DiacriticalTilde;": '\U000002DC', "Diamond;": '\U000022C4', "DifferentialD;": '\U00002146', "Dopf;": '\U0001D53B', "Dot;": '\U000000A8', "DotDot;": '\U000020DC', "DotEqual;": '\U00002250', "DoubleContourIntegral;": '\U0000222F', "DoubleDot;": '\U000000A8', "DoubleDownArrow;": '\U000021D3', "DoubleLeftArrow;": '\U000021D0', "DoubleLeftRightArrow;": '\U000021D4', "DoubleLeftTee;": '\U00002AE4', "DoubleLongLeftArrow;": '\U000027F8', "DoubleLongLeftRightArrow;": '\U000027FA', "DoubleLongRightArrow;": '\U000027F9', "DoubleRightArrow;": '\U000021D2', "DoubleRightTee;": '\U000022A8', "DoubleUpArrow;": '\U000021D1', "DoubleUpDownArrow;": '\U000021D5', "DoubleVerticalBar;": '\U00002225', "DownArrow;": '\U00002193', "DownArrowBar;": '\U00002913', "DownArrowUpArrow;": '\U000021F5', "DownBreve;": '\U00000311', "DownLeftRightVector;": '\U00002950', "DownLeftTeeVector;": '\U0000295E', "DownLeftVector;": '\U000021BD', "DownLeftVectorBar;": '\U00002956', "DownRightTeeVector;": '\U0000295F', "DownRightVector;": '\U000021C1', "DownRightVectorBar;": '\U00002957', "DownTee;": '\U000022A4', "DownTeeArrow;": '\U000021A7', "Downarrow;": '\U000021D3', "Dscr;": '\U0001D49F', "Dstrok;": '\U00000110', "ENG;": '\U0000014A', "ETH;": '\U000000D0', "Eacute;": '\U000000C9', "Ecaron;": '\U0000011A', "Ecirc;": '\U000000CA', "Ecy;": '\U0000042D', "Edot;": '\U00000116', "Efr;": '\U0001D508', "Egrave;": '\U000000C8', "Element;": '\U00002208', "Emacr;": '\U00000112', "EmptySmallSquare;": '\U000025FB', "EmptyVerySmallSquare;": '\U000025AB', "Eogon;": '\U00000118', "Eopf;": '\U0001D53C', "Epsilon;": '\U00000395', "Equal;": '\U00002A75', "EqualTilde;": '\U00002242', "Equilibrium;": '\U000021CC', "Escr;": '\U00002130', "Esim;": '\U00002A73', "Eta;": '\U00000397', "Euml;": '\U000000CB', "Exists;": '\U00002203', "ExponentialE;": '\U00002147', "Fcy;": '\U00000424', "Ffr;": '\U0001D509', "FilledSmallSquare;": '\U000025FC', "FilledVerySmallSquare;": '\U000025AA', "Fopf;": '\U0001D53D', "ForAll;": '\U00002200', "Fouriertrf;": '\U00002131', "Fscr;": '\U00002131', "GJcy;": '\U00000403', "GT;": '\U0000003E', "Gamma;": '\U00000393', "Gammad;": '\U000003DC', "Gbreve;": '\U0000011E', "Gcedil;": '\U00000122', "Gcirc;": '\U0000011C', "Gcy;": '\U00000413', "Gdot;": '\U00000120', "Gfr;": '\U0001D50A', "Gg;": '\U000022D9', "Gopf;": '\U0001D53E', "GreaterEqual;": '\U00002265', "GreaterEqualLess;": '\U000022DB', "GreaterFullEqual;": '\U00002267', "GreaterGreater;": '\U00002AA2', "GreaterLess;": '\U00002277', "GreaterSlantEqual;": '\U00002A7E', "GreaterTilde;": '\U00002273', "Gscr;": '\U0001D4A2', "Gt;": '\U0000226B', "HARDcy;": '\U0000042A', "Hacek;": '\U000002C7', "Hat;": '\U0000005E', "Hcirc;": '\U00000124', "Hfr;": '\U0000210C', "HilbertSpace;": '\U0000210B', "Hopf;": '\U0000210D', "HorizontalLine;": '\U00002500', "Hscr;": '\U0000210B', "Hstrok;": '\U00000126', "HumpDownHump;": '\U0000224E', "HumpEqual;": '\U0000224F', "IEcy;": '\U00000415', "IJlig;": '\U00000132', "IOcy;": '\U00000401', "Iacute;": '\U000000CD', "Icirc;": '\U000000CE', "Icy;": '\U00000418', "Idot;": '\U00000130', "Ifr;": '\U00002111', "Igrave;": '\U000000CC', "Im;": '\U00002111', "Imacr;": '\U0000012A', "ImaginaryI;": '\U00002148', "Implies;": '\U000021D2', "Int;": '\U0000222C', "Integral;": '\U0000222B', "Intersection;": '\U000022C2', "InvisibleComma;": '\U00002063', "InvisibleTimes;": '\U00002062', "Iogon;": '\U0000012E', "Iopf;": '\U0001D540', "Iota;": '\U00000399', "Iscr;": '\U00002110', "Itilde;": '\U00000128', "Iukcy;": '\U00000406', "Iuml;": '\U000000CF', "Jcirc;": '\U00000134', "Jcy;": '\U00000419', "Jfr;": '\U0001D50D', "Jopf;": '\U0001D541', "Jscr;": '\U0001D4A5', "Jsercy;": '\U00000408', "Jukcy;": '\U00000404', "KHcy;": '\U00000425', "KJcy;": '\U0000040C', "Kappa;": '\U0000039A', "Kcedil;": '\U00000136', "Kcy;": '\U0000041A', "Kfr;": '\U0001D50E', "Kopf;": '\U0001D542', "Kscr;": '\U0001D4A6', "LJcy;": '\U00000409', "LT;": '\U0000003C', "Lacute;": '\U00000139', "Lambda;": '\U0000039B', "Lang;": '\U000027EA', "Laplacetrf;": '\U00002112', "Larr;": '\U0000219E', "Lcaron;": '\U0000013D', "Lcedil;": '\U0000013B', "Lcy;": '\U0000041B', "LeftAngleBracket;": '\U000027E8', "LeftArrow;": '\U00002190', "LeftArrowBar;": '\U000021E4', "LeftArrowRightArrow;": '\U000021C6', "LeftCeiling;": '\U00002308', "LeftDoubleBracket;": '\U000027E6', "LeftDownTeeVector;": '\U00002961', "LeftDownVector;": '\U000021C3', "LeftDownVectorBar;": '\U00002959', "LeftFloor;": '\U0000230A', "LeftRightArrow;": '\U00002194', "LeftRightVector;": '\U0000294E', "LeftTee;": '\U000022A3', "LeftTeeArrow;": '\U000021A4', "LeftTeeVector;": '\U0000295A', "LeftTriangle;": '\U000022B2', "LeftTriangleBar;": '\U000029CF', "LeftTriangleEqual;": '\U000022B4', "LeftUpDownVector;": '\U00002951', "LeftUpTeeVector;": '\U00002960', "LeftUpVector;": '\U000021BF', "LeftUpVectorBar;": '\U00002958', "LeftVector;": '\U000021BC', "LeftVectorBar;": '\U00002952', "Leftarrow;": '\U000021D0', "Leftrightarrow;": '\U000021D4', "LessEqualGreater;": '\U000022DA', "LessFullEqual;": '\U00002266', "LessGreater;": '\U00002276', "LessLess;": '\U00002AA1', "LessSlantEqual;": '\U00002A7D', "LessTilde;": '\U00002272', "Lfr;": '\U0001D50F', "Ll;": '\U000022D8', "Lleftarrow;": '\U000021DA', "Lmidot;": '\U0000013F', "LongLeftArrow;": '\U000027F5', "LongLeftRightArrow;": '\U000027F7', "LongRightArrow;": '\U000027F6', "Longleftarrow;": '\U000027F8', "Longleftrightarrow;": '\U000027FA', "Longrightarrow;": '\U000027F9', "Lopf;": '\U0001D543', "LowerLeftArrow;": '\U00002199', "LowerRightArrow;": '\U00002198', "Lscr;": '\U00002112', "Lsh;": '\U000021B0', "Lstrok;": '\U00000141', "Lt;": '\U0000226A', "Map;": '\U00002905', "Mcy;": '\U0000041C', "MediumSpace;": '\U0000205F', "Mellintrf;": '\U00002133', "Mfr;": '\U0001D510', "MinusPlus;": '\U00002213', "Mopf;": '\U0001D544', "Mscr;": '\U00002133', "Mu;": '\U0000039C', "NJcy;": '\U0000040A', "Nacute;": '\U00000143', "Ncaron;": '\U00000147', "Ncedil;": '\U00000145', "Ncy;": '\U0000041D', "NegativeMediumSpace;": '\U0000200B', "NegativeThickSpace;": '\U0000200B', "NegativeThinSpace;": '\U0000200B', "NegativeVeryThinSpace;": '\U0000200B', "NestedGreaterGreater;": '\U0000226B', "NestedLessLess;": '\U0000226A', "NewLine;": '\U0000000A', "Nfr;": '\U0001D511', "NoBreak;": '\U00002060', "NonBreakingSpace;": '\U000000A0', "Nopf;": '\U00002115', "Not;": '\U00002AEC', "NotCongruent;": '\U00002262', "NotCupCap;": '\U0000226D', "NotDoubleVerticalBar;": '\U00002226', "NotElement;": '\U00002209', "NotEqual;": '\U00002260', "NotExists;": '\U00002204', "NotGreater;": '\U0000226F', "NotGreaterEqual;": '\U00002271', "NotGreaterLess;": '\U00002279', "NotGreaterTilde;": '\U00002275', "NotLeftTriangle;": '\U000022EA', "NotLeftTriangleEqual;": '\U000022EC', "NotLess;": '\U0000226E', "NotLessEqual;": '\U00002270', "NotLessGreater;": '\U00002278', "NotLessTilde;": '\U00002274', "NotPrecedes;": '\U00002280', "NotPrecedesSlantEqual;": '\U000022E0', "NotReverseElement;": '\U0000220C', "NotRightTriangle;": '\U000022EB', "NotRightTriangleEqual;": '\U000022ED', "NotSquareSubsetEqual;": '\U000022E2', "NotSquareSupersetEqual;": '\U000022E3', "NotSubsetEqual;": '\U00002288', "NotSucceeds;": '\U00002281', "NotSucceedsSlantEqual;": '\U000022E1', "NotSupersetEqual;": '\U00002289', "NotTilde;": '\U00002241', "NotTildeEqual;": '\U00002244', "NotTildeFullEqual;": '\U00002247', "NotTildeTilde;": '\U00002249', "NotVerticalBar;": '\U00002224', "Nscr;": '\U0001D4A9', "Ntilde;": '\U000000D1', "Nu;": '\U0000039D', "OElig;": '\U00000152', "Oacute;": '\U000000D3', "Ocirc;": '\U000000D4', "Ocy;": '\U0000041E', "Odblac;": '\U00000150', "Ofr;": '\U0001D512', "Ograve;": '\U000000D2', "Omacr;": '\U0000014C', "Omega;": '\U000003A9', "Omicron;": '\U0000039F', "Oopf;": '\U0001D546', "OpenCurlyDoubleQuote;": '\U0000201C', "OpenCurlyQuote;": '\U00002018', "Or;": '\U00002A54', "Oscr;": '\U0001D4AA', "Oslash;": '\U000000D8', "Otilde;": '\U000000D5', "Otimes;": '\U00002A37', "Ouml;": '\U000000D6', "OverBar;": '\U0000203E', "OverBrace;": '\U000023DE', "OverBracket;": '\U000023B4', "OverParenthesis;": '\U000023DC', "PartialD;": '\U00002202', "Pcy;": '\U0000041F', "Pfr;": '\U0001D513', "Phi;": '\U000003A6', "Pi;": '\U000003A0', "PlusMinus;": '\U000000B1', "Poincareplane;": '\U0000210C', "Popf;": '\U00002119', "Pr;": '\U00002ABB', "Precedes;": '\U0000227A', "PrecedesEqual;": '\U00002AAF', "PrecedesSlantEqual;": '\U0000227C', "PrecedesTilde;": '\U0000227E', "Prime;": '\U00002033', "Product;": '\U0000220F', "Proportion;": '\U00002237', "Proportional;": '\U0000221D', "Pscr;": '\U0001D4AB', "Psi;": '\U000003A8', "QUOT;": '\U00000022', "Qfr;": '\U0001D514', "Qopf;": '\U0000211A', "Qscr;": '\U0001D4AC', "RBarr;": '\U00002910', "REG;": '\U000000AE', "Racute;": '\U00000154', "Rang;": '\U000027EB', "Rarr;": '\U000021A0', "Rarrtl;": '\U00002916', "Rcaron;": '\U00000158', "Rcedil;": '\U00000156', "Rcy;": '\U00000420', "Re;": '\U0000211C', "ReverseElement;": '\U0000220B', "ReverseEquilibrium;": '\U000021CB', "ReverseUpEquilibrium;": '\U0000296F', "Rfr;": '\U0000211C', "Rho;": '\U000003A1', "RightAngleBracket;": '\U000027E9', "RightArrow;": '\U00002192', "RightArrowBar;": '\U000021E5', "RightArrowLeftArrow;": '\U000021C4', "RightCeiling;": '\U00002309', "RightDoubleBracket;": '\U000027E7', "RightDownTeeVector;": '\U0000295D', "RightDownVector;": '\U000021C2', "RightDownVectorBar;": '\U00002955', "RightFloor;": '\U0000230B', "RightTee;": '\U000022A2', "RightTeeArrow;": '\U000021A6', "RightTeeVector;": '\U0000295B', "RightTriangle;": '\U000022B3', "RightTriangleBar;": '\U000029D0', "RightTriangleEqual;": '\U000022B5', "RightUpDownVector;": '\U0000294F', "RightUpTeeVector;": '\U0000295C', "RightUpVector;": '\U000021BE', "RightUpVectorBar;": '\U00002954', "RightVector;": '\U000021C0', "RightVectorBar;": '\U00002953', "Rightarrow;": '\U000021D2', "Ropf;": '\U0000211D', "RoundImplies;": '\U00002970', "Rrightarrow;": '\U000021DB', "Rscr;": '\U0000211B', "Rsh;": '\U000021B1', "RuleDelayed;": '\U000029F4', "SHCHcy;": '\U00000429', "SHcy;": '\U00000428', "SOFTcy;": '\U0000042C', "Sacute;": '\U0000015A', "Sc;": '\U00002ABC', "Scaron;": '\U00000160', "Scedil;": '\U0000015E', "Scirc;": '\U0000015C', "Scy;": '\U00000421', "Sfr;": '\U0001D516', "ShortDownArrow;": '\U00002193', "ShortLeftArrow;": '\U00002190', "ShortRightArrow;": '\U00002192', "ShortUpArrow;": '\U00002191', "Sigma;": '\U000003A3', "SmallCircle;": '\U00002218', "Sopf;": '\U0001D54A', "Sqrt;": '\U0000221A', "Square;": '\U000025A1', "SquareIntersection;": '\U00002293', "SquareSubset;": '\U0000228F', "SquareSubsetEqual;": '\U00002291', "SquareSuperset;": '\U00002290', "SquareSupersetEqual;": '\U00002292', "SquareUnion;": '\U00002294', "Sscr;": '\U0001D4AE', "Star;": '\U000022C6', "Sub;": '\U000022D0', "Subset;": '\U000022D0', "SubsetEqual;": '\U00002286', "Succeeds;": '\U0000227B', "SucceedsEqual;": '\U00002AB0', "SucceedsSlantEqual;": '\U0000227D', "SucceedsTilde;": '\U0000227F', "SuchThat;": '\U0000220B', "Sum;": '\U00002211', "Sup;": '\U000022D1', "Superset;": '\U00002283', "SupersetEqual;": '\U00002287', "Supset;": '\U000022D1', "THORN;": '\U000000DE', "TRADE;": '\U00002122', "TSHcy;": '\U0000040B', "TScy;": '\U00000426', "Tab;": '\U00000009', "Tau;": '\U000003A4', "Tcaron;": '\U00000164', "Tcedil;": '\U00000162', "Tcy;": '\U00000422', "Tfr;": '\U0001D517', "Therefore;": '\U00002234', "Theta;": '\U00000398', "ThinSpace;": '\U00002009', "Tilde;": '\U0000223C', "TildeEqual;": '\U00002243', "TildeFullEqual;": '\U00002245', "TildeTilde;": '\U00002248', "Topf;": '\U0001D54B', "TripleDot;": '\U000020DB', "Tscr;": '\U0001D4AF', "Tstrok;": '\U00000166', "Uacute;": '\U000000DA', "Uarr;": '\U0000219F', "Uarrocir;": '\U00002949', "Ubrcy;": '\U0000040E', "Ubreve;": '\U0000016C', "Ucirc;": '\U000000DB', "Ucy;": '\U00000423', "Udblac;": '\U00000170', "Ufr;": '\U0001D518', "Ugrave;": '\U000000D9', "Umacr;": '\U0000016A', "UnderBar;": '\U0000005F', "UnderBrace;": '\U000023DF', "UnderBracket;": '\U000023B5', "UnderParenthesis;": '\U000023DD', "Union;": '\U000022C3', "UnionPlus;": '\U0000228E', "Uogon;": '\U00000172', "Uopf;": '\U0001D54C', "UpArrow;": '\U00002191', "UpArrowBar;": '\U00002912', "UpArrowDownArrow;": '\U000021C5', "UpDownArrow;": '\U00002195', "UpEquilibrium;": '\U0000296E', "UpTee;": '\U000022A5', "UpTeeArrow;": '\U000021A5', "Uparrow;": '\U000021D1', "Updownarrow;": '\U000021D5', "UpperLeftArrow;": '\U00002196', "UpperRightArrow;": '\U00002197', "Upsi;": '\U000003D2', "Upsilon;": '\U000003A5', "Uring;": '\U0000016E', "Uscr;": '\U0001D4B0', "Utilde;": '\U00000168', "Uuml;": '\U000000DC', "VDash;": '\U000022AB', "Vbar;": '\U00002AEB', "Vcy;": '\U00000412', "Vdash;": '\U000022A9', "Vdashl;": '\U00002AE6', "Vee;": '\U000022C1', "Verbar;": '\U00002016', "Vert;": '\U00002016', "VerticalBar;": '\U00002223', "VerticalLine;": '\U0000007C', "VerticalSeparator;": '\U00002758', "VerticalTilde;": '\U00002240', "VeryThinSpace;": '\U0000200A', "Vfr;": '\U0001D519', "Vopf;": '\U0001D54D', "Vscr;": '\U0001D4B1', "Vvdash;": '\U000022AA', "Wcirc;": '\U00000174', "Wedge;": '\U000022C0', "Wfr;": '\U0001D51A', "Wopf;": '\U0001D54E', "Wscr;": '\U0001D4B2', "Xfr;": '\U0001D51B', "Xi;": '\U0000039E', "Xopf;": '\U0001D54F', "Xscr;": '\U0001D4B3', "YAcy;": '\U0000042F', "YIcy;": '\U00000407', "YUcy;": '\U0000042E', "Yacute;": '\U000000DD', "Ycirc;": '\U00000176', "Ycy;": '\U0000042B', "Yfr;": '\U0001D51C', "Yopf;": '\U0001D550', "Yscr;": '\U0001D4B4', "Yuml;": '\U00000178', "ZHcy;": '\U00000416', "Zacute;": '\U00000179', "Zcaron;": '\U0000017D', "Zcy;": '\U00000417', "Zdot;": '\U0000017B', "ZeroWidthSpace;": '\U0000200B', "Zeta;": '\U00000396', "Zfr;": '\U00002128', "Zopf;": '\U00002124', "Zscr;": '\U0001D4B5', "aacute;": '\U000000E1', "abreve;": '\U00000103', "ac;": '\U0000223E', "acd;": '\U0000223F', "acirc;": '\U000000E2', "acute;": '\U000000B4', "acy;": '\U00000430', "aelig;": '\U000000E6', "af;": '\U00002061', "afr;": '\U0001D51E', "agrave;": '\U000000E0', "alefsym;": '\U00002135', "aleph;": '\U00002135', "alpha;": '\U000003B1', "amacr;": '\U00000101', "amalg;": '\U00002A3F', "amp;": '\U00000026', "and;": '\U00002227', "andand;": '\U00002A55', "andd;": '\U00002A5C', "andslope;": '\U00002A58', "andv;": '\U00002A5A', "ang;": '\U00002220', "ange;": '\U000029A4', "angle;": '\U00002220', "angmsd;": '\U00002221', "angmsdaa;": '\U000029A8', "angmsdab;": '\U000029A9', "angmsdac;": '\U000029AA', "angmsdad;": '\U000029AB', "angmsdae;": '\U000029AC', "angmsdaf;": '\U000029AD', "angmsdag;": '\U000029AE', "angmsdah;": '\U000029AF', "angrt;": '\U0000221F', "angrtvb;": '\U000022BE', "angrtvbd;": '\U0000299D', "angsph;": '\U00002222', "angst;": '\U000000C5', "angzarr;": '\U0000237C', "aogon;": '\U00000105', "aopf;": '\U0001D552', "ap;": '\U00002248', "apE;": '\U00002A70', "apacir;": '\U00002A6F', "ape;": '\U0000224A', "apid;": '\U0000224B', "apos;": '\U00000027', "approx;": '\U00002248', "approxeq;": '\U0000224A', "aring;": '\U000000E5', "ascr;": '\U0001D4B6', "ast;": '\U0000002A', "asymp;": '\U00002248', "asympeq;": '\U0000224D', "atilde;": '\U000000E3', "auml;": '\U000000E4', "awconint;": '\U00002233', "awint;": '\U00002A11', "bNot;": '\U00002AED', "backcong;": '\U0000224C', "backepsilon;": '\U000003F6', "backprime;": '\U00002035', "backsim;": '\U0000223D', "backsimeq;": '\U000022CD', "barvee;": '\U000022BD', "barwed;": '\U00002305', "barwedge;": '\U00002305', "bbrk;": '\U000023B5', "bbrktbrk;": '\U000023B6', "bcong;": '\U0000224C', "bcy;": '\U00000431', "bdquo;": '\U0000201E', "becaus;": '\U00002235', "because;": '\U00002235', "bemptyv;": '\U000029B0', "bepsi;": '\U000003F6', "bernou;": '\U0000212C', "beta;": '\U000003B2', "beth;": '\U00002136', "between;": '\U0000226C', "bfr;": '\U0001D51F', "bigcap;": '\U000022C2', "bigcirc;": '\U000025EF', "bigcup;": '\U000022C3', "bigodot;": '\U00002A00', "bigoplus;": '\U00002A01', "bigotimes;": '\U00002A02', "bigsqcup;": '\U00002A06', "bigstar;": '\U00002605', "bigtriangledown;": '\U000025BD', "bigtriangleup;": '\U000025B3', "biguplus;": '\U00002A04', "bigvee;": '\U000022C1', "bigwedge;": '\U000022C0', "bkarow;": '\U0000290D', "blacklozenge;": '\U000029EB', "blacksquare;": '\U000025AA', "blacktriangle;": '\U000025B4', "blacktriangledown;": '\U000025BE', "blacktriangleleft;": '\U000025C2', "blacktriangleright;": '\U000025B8', "blank;": '\U00002423', "blk12;": '\U00002592', "blk14;": '\U00002591', "blk34;": '\U00002593', "block;": '\U00002588', "bnot;": '\U00002310', "bopf;": '\U0001D553', "bot;": '\U000022A5', "bottom;": '\U000022A5', "bowtie;": '\U000022C8', "boxDL;": '\U00002557', "boxDR;": '\U00002554', "boxDl;": '\U00002556', "boxDr;": '\U00002553', "boxH;": '\U00002550', "boxHD;": '\U00002566', "boxHU;": '\U00002569', "boxHd;": '\U00002564', "boxHu;": '\U00002567', "boxUL;": '\U0000255D', "boxUR;": '\U0000255A', "boxUl;": '\U0000255C', "boxUr;": '\U00002559', "boxV;": '\U00002551', "boxVH;": '\U0000256C', "boxVL;": '\U00002563', "boxVR;": '\U00002560', "boxVh;": '\U0000256B', "boxVl;": '\U00002562', "boxVr;": '\U0000255F', "boxbox;": '\U000029C9', "boxdL;": '\U00002555', "boxdR;": '\U00002552', "boxdl;": '\U00002510', "boxdr;": '\U0000250C', "boxh;": '\U00002500', "boxhD;": '\U00002565', "boxhU;": '\U00002568', "boxhd;": '\U0000252C', "boxhu;": '\U00002534', "boxminus;": '\U0000229F', "boxplus;": '\U0000229E', "boxtimes;": '\U000022A0', "boxuL;": '\U0000255B', "boxuR;": '\U00002558', "boxul;": '\U00002518', "boxur;": '\U00002514', "boxv;": '\U00002502', "boxvH;": '\U0000256A', "boxvL;": '\U00002561', "boxvR;": '\U0000255E', "boxvh;": '\U0000253C', "boxvl;": '\U00002524', "boxvr;": '\U0000251C', "bprime;": '\U00002035', "breve;": '\U000002D8', "brvbar;": '\U000000A6', "bscr;": '\U0001D4B7', "bsemi;": '\U0000204F', "bsim;": '\U0000223D', "bsime;": '\U000022CD', "bsol;": '\U0000005C', "bsolb;": '\U000029C5', "bsolhsub;": '\U000027C8', "bull;": '\U00002022', "bullet;": '\U00002022', "bump;": '\U0000224E', "bumpE;": '\U00002AAE', "bumpe;": '\U0000224F', "bumpeq;": '\U0000224F', "cacute;": '\U00000107', "cap;": '\U00002229', "capand;": '\U00002A44', "capbrcup;": '\U00002A49', "capcap;": '\U00002A4B', "capcup;": '\U00002A47', "capdot;": '\U00002A40', "caret;": '\U00002041', "caron;": '\U000002C7', "ccaps;": '\U00002A4D', "ccaron;": '\U0000010D', "ccedil;": '\U000000E7', "ccirc;": '\U00000109', "ccups;": '\U00002A4C', "ccupssm;": '\U00002A50', "cdot;": '\U0000010B', "cedil;": '\U000000B8', "cemptyv;": '\U000029B2', "cent;": '\U000000A2', "centerdot;": '\U000000B7', "cfr;": '\U0001D520', "chcy;": '\U00000447', "check;": '\U00002713', "checkmark;": '\U00002713', "chi;": '\U000003C7', "cir;": '\U000025CB', "cirE;": '\U000029C3', "circ;": '\U000002C6', "circeq;": '\U00002257', "circlearrowleft;": '\U000021BA', "circlearrowright;": '\U000021BB', "circledR;": '\U000000AE', "circledS;": '\U000024C8', "circledast;": '\U0000229B', "circledcirc;": '\U0000229A', "circleddash;": '\U0000229D', "cire;": '\U00002257', "cirfnint;": '\U00002A10', "cirmid;": '\U00002AEF', "cirscir;": '\U000029C2', "clubs;": '\U00002663', "clubsuit;": '\U00002663', "colon;": '\U0000003A', "colone;": '\U00002254', "coloneq;": '\U00002254', "comma;": '\U0000002C', "commat;": '\U00000040', "comp;": '\U00002201', "compfn;": '\U00002218', "complement;": '\U00002201', "complexes;": '\U00002102', "cong;": '\U00002245', "congdot;": '\U00002A6D', "conint;": '\U0000222E', "copf;": '\U0001D554', "coprod;": '\U00002210', "copy;": '\U000000A9', "copysr;": '\U00002117', "crarr;": '\U000021B5', "cross;": '\U00002717', "cscr;": '\U0001D4B8', "csub;": '\U00002ACF', "csube;": '\U00002AD1', "csup;": '\U00002AD0', "csupe;": '\U00002AD2', "ctdot;": '\U000022EF', "cudarrl;": '\U00002938', "cudarrr;": '\U00002935', "cuepr;": '\U000022DE', "cuesc;": '\U000022DF', "cularr;": '\U000021B6', "cularrp;": '\U0000293D', "cup;": '\U0000222A', "cupbrcap;": '\U00002A48', "cupcap;": '\U00002A46', "cupcup;": '\U00002A4A', "cupdot;": '\U0000228D', "cupor;": '\U00002A45', "curarr;": '\U000021B7', "curarrm;": '\U0000293C', "curlyeqprec;": '\U000022DE', "curlyeqsucc;": '\U000022DF', "curlyvee;": '\U000022CE', "curlywedge;": '\U000022CF', "curren;": '\U000000A4', "curvearrowleft;": '\U000021B6', "curvearrowright;": '\U000021B7', "cuvee;": '\U000022CE', "cuwed;": '\U000022CF', "cwconint;": '\U00002232', "cwint;": '\U00002231', "cylcty;": '\U0000232D', "dArr;": '\U000021D3', "dHar;": '\U00002965', "dagger;": '\U00002020', "daleth;": '\U00002138', "darr;": '\U00002193', "dash;": '\U00002010', "dashv;": '\U000022A3', "dbkarow;": '\U0000290F', "dblac;": '\U000002DD', "dcaron;": '\U0000010F', "dcy;": '\U00000434', "dd;": '\U00002146', "ddagger;": '\U00002021', "ddarr;": '\U000021CA', "ddotseq;": '\U00002A77', "deg;": '\U000000B0', "delta;": '\U000003B4', "demptyv;": '\U000029B1', "dfisht;": '\U0000297F', "dfr;": '\U0001D521', "dharl;": '\U000021C3', "dharr;": '\U000021C2', "diam;": '\U000022C4', "diamond;": '\U000022C4', "diamondsuit;": '\U00002666', "diams;": '\U00002666', "die;": '\U000000A8', "digamma;": '\U000003DD', "disin;": '\U000022F2', "div;": '\U000000F7', "divide;": '\U000000F7', "divideontimes;": '\U000022C7', "divonx;": '\U000022C7', "djcy;": '\U00000452', "dlcorn;": '\U0000231E', "dlcrop;": '\U0000230D', "dollar;": '\U00000024', "dopf;": '\U0001D555', "dot;": '\U000002D9', "doteq;": '\U00002250', "doteqdot;": '\U00002251', "dotminus;": '\U00002238', "dotplus;": '\U00002214', "dotsquare;": '\U000022A1', "doublebarwedge;": '\U00002306', "downarrow;": '\U00002193', "downdownarrows;": '\U000021CA', "downharpoonleft;": '\U000021C3', "downharpoonright;": '\U000021C2', "drbkarow;": '\U00002910', "drcorn;": '\U0000231F', "drcrop;": '\U0000230C', "dscr;": '\U0001D4B9', "dscy;": '\U00000455', "dsol;": '\U000029F6', "dstrok;": '\U00000111', "dtdot;": '\U000022F1', "dtri;": '\U000025BF', "dtrif;": '\U000025BE', "duarr;": '\U000021F5', "duhar;": '\U0000296F', "dwangle;": '\U000029A6', "dzcy;": '\U0000045F', "dzigrarr;": '\U000027FF', "eDDot;": '\U00002A77', "eDot;": '\U00002251', "eacute;": '\U000000E9', "easter;": '\U00002A6E', "ecaron;": '\U0000011B', "ecir;": '\U00002256', "ecirc;": '\U000000EA', "ecolon;": '\U00002255', "ecy;": '\U0000044D', "edot;": '\U00000117', "ee;": '\U00002147', "efDot;": '\U00002252', "efr;": '\U0001D522', "eg;": '\U00002A9A', "egrave;": '\U000000E8', "egs;": '\U00002A96', "egsdot;": '\U00002A98', "el;": '\U00002A99', "elinters;": '\U000023E7', "ell;": '\U00002113', "els;": '\U00002A95', "elsdot;": '\U00002A97', "emacr;": '\U00000113', "empty;": '\U00002205', "emptyset;": '\U00002205', "emptyv;": '\U00002205', "emsp;": '\U00002003', "emsp13;": '\U00002004', "emsp14;": '\U00002005', "eng;": '\U0000014B', "ensp;": '\U00002002', "eogon;": '\U00000119', "eopf;": '\U0001D556', "epar;": '\U000022D5', "eparsl;": '\U000029E3', "eplus;": '\U00002A71', "epsi;": '\U000003B5', "epsilon;": '\U000003B5', "epsiv;": '\U000003F5', "eqcirc;": '\U00002256', "eqcolon;": '\U00002255', "eqsim;": '\U00002242', "eqslantgtr;": '\U00002A96', "eqslantless;": '\U00002A95', "equals;": '\U0000003D', "equest;": '\U0000225F', "equiv;": '\U00002261', "equivDD;": '\U00002A78', "eqvparsl;": '\U000029E5', "erDot;": '\U00002253', "erarr;": '\U00002971', "escr;": '\U0000212F', "esdot;": '\U00002250', "esim;": '\U00002242', "eta;": '\U000003B7', "eth;": '\U000000F0', "euml;": '\U000000EB', "euro;": '\U000020AC', "excl;": '\U00000021', "exist;": '\U00002203', "expectation;": '\U00002130', "exponentiale;": '\U00002147', "fallingdotseq;": '\U00002252', "fcy;": '\U00000444', "female;": '\U00002640', "ffilig;": '\U0000FB03', "fflig;": '\U0000FB00', "ffllig;": '\U0000FB04', "ffr;": '\U0001D523', "filig;": '\U0000FB01', "flat;": '\U0000266D', "fllig;": '\U0000FB02', "fltns;": '\U000025B1', "fnof;": '\U00000192', "fopf;": '\U0001D557', "forall;": '\U00002200', "fork;": '\U000022D4', "forkv;": '\U00002AD9', "fpartint;": '\U00002A0D', "frac12;": '\U000000BD', "frac13;": '\U00002153', "frac14;": '\U000000BC', "frac15;": '\U00002155', "frac16;": '\U00002159', "frac18;": '\U0000215B', "frac23;": '\U00002154', "frac25;": '\U00002156', "frac34;": '\U000000BE', "frac35;": '\U00002157', "frac38;": '\U0000215C', "frac45;": '\U00002158', "frac56;": '\U0000215A', "frac58;": '\U0000215D', "frac78;": '\U0000215E', "frasl;": '\U00002044', "frown;": '\U00002322', "fscr;": '\U0001D4BB', "gE;": '\U00002267', "gEl;": '\U00002A8C', "gacute;": '\U000001F5', "gamma;": '\U000003B3', "gammad;": '\U000003DD', "gap;": '\U00002A86', "gbreve;": '\U0000011F', "gcirc;": '\U0000011D', "gcy;": '\U00000433', "gdot;": '\U00000121', "ge;": '\U00002265', "gel;": '\U000022DB', "geq;": '\U00002265', "geqq;": '\U00002267', "geqslant;": '\U00002A7E', "ges;": '\U00002A7E', "gescc;": '\U00002AA9', "gesdot;": '\U00002A80', "gesdoto;": '\U00002A82', "gesdotol;": '\U00002A84', "gesles;": '\U00002A94', "gfr;": '\U0001D524', "gg;": '\U0000226B', "ggg;": '\U000022D9', "gimel;": '\U00002137', "gjcy;": '\U00000453', "gl;": '\U00002277', "glE;": '\U00002A92', "gla;": '\U00002AA5', "glj;": '\U00002AA4', "gnE;": '\U00002269', "gnap;": '\U00002A8A', "gnapprox;": '\U00002A8A', "gne;": '\U00002A88', "gneq;": '\U00002A88', "gneqq;": '\U00002269', "gnsim;": '\U000022E7', "gopf;": '\U0001D558', "grave;": '\U00000060', "gscr;": '\U0000210A', "gsim;": '\U00002273', "gsime;": '\U00002A8E', "gsiml;": '\U00002A90', "gt;": '\U0000003E', "gtcc;": '\U00002AA7', "gtcir;": '\U00002A7A', "gtdot;": '\U000022D7', "gtlPar;": '\U00002995', "gtquest;": '\U00002A7C', "gtrapprox;": '\U00002A86', "gtrarr;": '\U00002978', "gtrdot;": '\U000022D7', "gtreqless;": '\U000022DB', "gtreqqless;": '\U00002A8C', "gtrless;": '\U00002277', "gtrsim;": '\U00002273', "hArr;": '\U000021D4', "hairsp;": '\U0000200A', "half;": '\U000000BD', "hamilt;": '\U0000210B', "hardcy;": '\U0000044A', "harr;": '\U00002194', "harrcir;": '\U00002948', "harrw;": '\U000021AD', "hbar;": '\U0000210F', "hcirc;": '\U00000125', "hearts;": '\U00002665', "heartsuit;": '\U00002665', "hellip;": '\U00002026', "hercon;": '\U000022B9', "hfr;": '\U0001D525', "hksearow;": '\U00002925', "hkswarow;": '\U00002926', "hoarr;": '\U000021FF', "homtht;": '\U0000223B', "hookleftarrow;": '\U000021A9', "hookrightarrow;": '\U000021AA', "hopf;": '\U0001D559', "horbar;": '\U00002015', "hscr;": '\U0001D4BD', "hslash;": '\U0000210F', "hstrok;": '\U00000127', "hybull;": '\U00002043', "hyphen;": '\U00002010', "iacute;": '\U000000ED', "ic;": '\U00002063', "icirc;": '\U000000EE', "icy;": '\U00000438', "iecy;": '\U00000435', "iexcl;": '\U000000A1', "iff;": '\U000021D4', "ifr;": '\U0001D526', "igrave;": '\U000000EC', "ii;": '\U00002148', "iiiint;": '\U00002A0C', "iiint;": '\U0000222D', "iinfin;": '\U000029DC', "iiota;": '\U00002129', "ijlig;": '\U00000133', "imacr;": '\U0000012B', "image;": '\U00002111', "imagline;": '\U00002110', "imagpart;": '\U00002111', "imath;": '\U00000131', "imof;": '\U000022B7', "imped;": '\U000001B5', "in;": '\U00002208', "incare;": '\U00002105', "infin;": '\U0000221E', "infintie;": '\U000029DD', "inodot;": '\U00000131', "int;": '\U0000222B', "intcal;": '\U000022BA', "integers;": '\U00002124', "intercal;": '\U000022BA', "intlarhk;": '\U00002A17', "intprod;": '\U00002A3C', "iocy;": '\U00000451', "iogon;": '\U0000012F', "iopf;": '\U0001D55A', "iota;": '\U000003B9', "iprod;": '\U00002A3C', "iquest;": '\U000000BF', "iscr;": '\U0001D4BE', "isin;": '\U00002208', "isinE;": '\U000022F9', "isindot;": '\U000022F5', "isins;": '\U000022F4', "isinsv;": '\U000022F3', "isinv;": '\U00002208', "it;": '\U00002062', "itilde;": '\U00000129', "iukcy;": '\U00000456', "iuml;": '\U000000EF', "jcirc;": '\U00000135', "jcy;": '\U00000439', "jfr;": '\U0001D527', "jmath;": '\U00000237', "jopf;": '\U0001D55B', "jscr;": '\U0001D4BF', "jsercy;": '\U00000458', "jukcy;": '\U00000454', "kappa;": '\U000003BA', "kappav;": '\U000003F0', "kcedil;": '\U00000137', "kcy;": '\U0000043A', "kfr;": '\U0001D528', "kgreen;": '\U00000138', "khcy;": '\U00000445', "kjcy;": '\U0000045C', "kopf;": '\U0001D55C', "kscr;": '\U0001D4C0', "lAarr;": '\U000021DA', "lArr;": '\U000021D0', "lAtail;": '\U0000291B', "lBarr;": '\U0000290E', "lE;": '\U00002266', "lEg;": '\U00002A8B', "lHar;": '\U00002962', "lacute;": '\U0000013A', "laemptyv;": '\U000029B4', "lagran;": '\U00002112', "lambda;": '\U000003BB', "lang;": '\U000027E8', "langd;": '\U00002991', "langle;": '\U000027E8', "lap;": '\U00002A85', "laquo;": '\U000000AB', "larr;": '\U00002190', "larrb;": '\U000021E4', "larrbfs;": '\U0000291F', "larrfs;": '\U0000291D', "larrhk;": '\U000021A9', "larrlp;": '\U000021AB', "larrpl;": '\U00002939', "larrsim;": '\U00002973', "larrtl;": '\U000021A2', "lat;": '\U00002AAB', "latail;": '\U00002919', "late;": '\U00002AAD', "lbarr;": '\U0000290C', "lbbrk;": '\U00002772', "lbrace;": '\U0000007B', "lbrack;": '\U0000005B', "lbrke;": '\U0000298B', "lbrksld;": '\U0000298F', "lbrkslu;": '\U0000298D', "lcaron;": '\U0000013E', "lcedil;": '\U0000013C', "lceil;": '\U00002308', "lcub;": '\U0000007B', "lcy;": '\U0000043B', "ldca;": '\U00002936', "ldquo;": '\U0000201C', "ldquor;": '\U0000201E', "ldrdhar;": '\U00002967', "ldrushar;": '\U0000294B', "ldsh;": '\U000021B2', "le;": '\U00002264', "leftarrow;": '\U00002190', "leftarrowtail;": '\U000021A2', "leftharpoondown;": '\U000021BD', "leftharpoonup;": '\U000021BC', "leftleftarrows;": '\U000021C7', "leftrightarrow;": '\U00002194', "leftrightarrows;": '\U000021C6', "leftrightharpoons;": '\U000021CB', "leftrightsquigarrow;": '\U000021AD', "leftthreetimes;": '\U000022CB', "leg;": '\U000022DA', "leq;": '\U00002264', "leqq;": '\U00002266', "leqslant;": '\U00002A7D', "les;": '\U00002A7D', "lescc;": '\U00002AA8', "lesdot;": '\U00002A7F', "lesdoto;": '\U00002A81', "lesdotor;": '\U00002A83', "lesges;": '\U00002A93', "lessapprox;": '\U00002A85', "lessdot;": '\U000022D6', "lesseqgtr;": '\U000022DA', "lesseqqgtr;": '\U00002A8B', "lessgtr;": '\U00002276', "lesssim;": '\U00002272', "lfisht;": '\U0000297C', "lfloor;": '\U0000230A', "lfr;": '\U0001D529', "lg;": '\U00002276', "lgE;": '\U00002A91', "lhard;": '\U000021BD', "lharu;": '\U000021BC', "lharul;": '\U0000296A', "lhblk;": '\U00002584', "ljcy;": '\U00000459', "ll;": '\U0000226A', "llarr;": '\U000021C7', "llcorner;": '\U0000231E', "llhard;": '\U0000296B', "lltri;": '\U000025FA', "lmidot;": '\U00000140', "lmoust;": '\U000023B0', "lmoustache;": '\U000023B0', "lnE;": '\U00002268', "lnap;": '\U00002A89', "lnapprox;": '\U00002A89', "lne;": '\U00002A87', "lneq;": '\U00002A87', "lneqq;": '\U00002268', "lnsim;": '\U000022E6', "loang;": '\U000027EC', "loarr;": '\U000021FD', "lobrk;": '\U000027E6', "longleftarrow;": '\U000027F5', "longleftrightarrow;": '\U000027F7', "longmapsto;": '\U000027FC', "longrightarrow;": '\U000027F6', "looparrowleft;": '\U000021AB', "looparrowright;": '\U000021AC', "lopar;": '\U00002985', "lopf;": '\U0001D55D', "loplus;": '\U00002A2D', "lotimes;": '\U00002A34', "lowast;": '\U00002217', "lowbar;": '\U0000005F', "loz;": '\U000025CA', "lozenge;": '\U000025CA', "lozf;": '\U000029EB', "lpar;": '\U00000028', "lparlt;": '\U00002993', "lrarr;": '\U000021C6', "lrcorner;": '\U0000231F', "lrhar;": '\U000021CB', "lrhard;": '\U0000296D', "lrm;": '\U0000200E', "lrtri;": '\U000022BF', "lsaquo;": '\U00002039', "lscr;": '\U0001D4C1', "lsh;": '\U000021B0', "lsim;": '\U00002272', "lsime;": '\U00002A8D', "lsimg;": '\U00002A8F', "lsqb;": '\U0000005B', "lsquo;": '\U00002018', "lsquor;": '\U0000201A', "lstrok;": '\U00000142', "lt;": '\U0000003C', "ltcc;": '\U00002AA6', "ltcir;": '\U00002A79', "ltdot;": '\U000022D6', "lthree;": '\U000022CB', "ltimes;": '\U000022C9', "ltlarr;": '\U00002976', "ltquest;": '\U00002A7B', "ltrPar;": '\U00002996', "ltri;": '\U000025C3', "ltrie;": '\U000022B4', "ltrif;": '\U000025C2', "lurdshar;": '\U0000294A', "luruhar;": '\U00002966', "mDDot;": '\U0000223A', "macr;": '\U000000AF', "male;": '\U00002642', "malt;": '\U00002720', "maltese;": '\U00002720', "map;": '\U000021A6', "mapsto;": '\U000021A6', "mapstodown;": '\U000021A7', "mapstoleft;": '\U000021A4', "mapstoup;": '\U000021A5', "marker;": '\U000025AE', "mcomma;": '\U00002A29', "mcy;": '\U0000043C', "mdash;": '\U00002014', "measuredangle;": '\U00002221', "mfr;": '\U0001D52A', "mho;": '\U00002127', "micro;": '\U000000B5', "mid;": '\U00002223', "midast;": '\U0000002A', "midcir;": '\U00002AF0', "middot;": '\U000000B7', "minus;": '\U00002212', "minusb;": '\U0000229F', "minusd;": '\U00002238', "minusdu;": '\U00002A2A', "mlcp;": '\U00002ADB', "mldr;": '\U00002026', "mnplus;": '\U00002213', "models;": '\U000022A7', "mopf;": '\U0001D55E', "mp;": '\U00002213', "mscr;": '\U0001D4C2', "mstpos;": '\U0000223E', "mu;": '\U000003BC', "multimap;": '\U000022B8', "mumap;": '\U000022B8', "nLeftarrow;": '\U000021CD', "nLeftrightarrow;": '\U000021CE', "nRightarrow;": '\U000021CF', "nVDash;": '\U000022AF', "nVdash;": '\U000022AE', "nabla;": '\U00002207', "nacute;": '\U00000144', "nap;": '\U00002249', "napos;": '\U00000149', "napprox;": '\U00002249', "natur;": '\U0000266E', "natural;": '\U0000266E', "naturals;": '\U00002115', "nbsp;": '\U000000A0', "ncap;": '\U00002A43', "ncaron;": '\U00000148', "ncedil;": '\U00000146', "ncong;": '\U00002247', "ncup;": '\U00002A42', "ncy;": '\U0000043D', "ndash;": '\U00002013', "ne;": '\U00002260', "neArr;": '\U000021D7', "nearhk;": '\U00002924', "nearr;": '\U00002197', "nearrow;": '\U00002197', "nequiv;": '\U00002262', "nesear;": '\U00002928', "nexist;": '\U00002204', "nexists;": '\U00002204', "nfr;": '\U0001D52B', "nge;": '\U00002271', "ngeq;": '\U00002271', "ngsim;": '\U00002275', "ngt;": '\U0000226F', "ngtr;": '\U0000226F', "nhArr;": '\U000021CE', "nharr;": '\U000021AE', "nhpar;": '\U00002AF2', "ni;": '\U0000220B', "nis;": '\U000022FC', "nisd;": '\U000022FA', "niv;": '\U0000220B', "njcy;": '\U0000045A', "nlArr;": '\U000021CD', "nlarr;": '\U0000219A', "nldr;": '\U00002025', "nle;": '\U00002270', "nleftarrow;": '\U0000219A', "nleftrightarrow;": '\U000021AE', "nleq;": '\U00002270', "nless;": '\U0000226E', "nlsim;": '\U00002274', "nlt;": '\U0000226E', "nltri;": '\U000022EA', "nltrie;": '\U000022EC', "nmid;": '\U00002224', "nopf;": '\U0001D55F', "not;": '\U000000AC', "notin;": '\U00002209', "notinva;": '\U00002209', "notinvb;": '\U000022F7', "notinvc;": '\U000022F6', "notni;": '\U0000220C', "notniva;": '\U0000220C', "notnivb;": '\U000022FE', "notnivc;": '\U000022FD', "npar;": '\U00002226', "nparallel;": '\U00002226', "npolint;": '\U00002A14', "npr;": '\U00002280', "nprcue;": '\U000022E0', "nprec;": '\U00002280', "nrArr;": '\U000021CF', "nrarr;": '\U0000219B', "nrightarrow;": '\U0000219B', "nrtri;": '\U000022EB', "nrtrie;": '\U000022ED', "nsc;": '\U00002281', "nsccue;": '\U000022E1', "nscr;": '\U0001D4C3', "nshortmid;": '\U00002224', "nshortparallel;": '\U00002226', "nsim;": '\U00002241', "nsime;": '\U00002244', "nsimeq;": '\U00002244', "nsmid;": '\U00002224', "nspar;": '\U00002226', "nsqsube;": '\U000022E2', "nsqsupe;": '\U000022E3', "nsub;": '\U00002284', "nsube;": '\U00002288', "nsubseteq;": '\U00002288', "nsucc;": '\U00002281', "nsup;": '\U00002285', "nsupe;": '\U00002289', "nsupseteq;": '\U00002289', "ntgl;": '\U00002279', "ntilde;": '\U000000F1', "ntlg;": '\U00002278', "ntriangleleft;": '\U000022EA', "ntrianglelefteq;": '\U000022EC', "ntriangleright;": '\U000022EB', "ntrianglerighteq;": '\U000022ED', "nu;": '\U000003BD', "num;": '\U00000023', "numero;": '\U00002116', "numsp;": '\U00002007', "nvDash;": '\U000022AD', "nvHarr;": '\U00002904', "nvdash;": '\U000022AC', "nvinfin;": '\U000029DE', "nvlArr;": '\U00002902', "nvrArr;": '\U00002903', "nwArr;": '\U000021D6', "nwarhk;": '\U00002923', "nwarr;": '\U00002196', "nwarrow;": '\U00002196', "nwnear;": '\U00002927', "oS;": '\U000024C8', "oacute;": '\U000000F3', "oast;": '\U0000229B', "ocir;": '\U0000229A', "ocirc;": '\U000000F4', "ocy;": '\U0000043E', "odash;": '\U0000229D', "odblac;": '\U00000151', "odiv;": '\U00002A38', "odot;": '\U00002299', "odsold;": '\U000029BC', "oelig;": '\U00000153', "ofcir;": '\U000029BF', "ofr;": '\U0001D52C', "ogon;": '\U000002DB', "ograve;": '\U000000F2', "ogt;": '\U000029C1', "ohbar;": '\U000029B5', "ohm;": '\U000003A9', "oint;": '\U0000222E', "olarr;": '\U000021BA', "olcir;": '\U000029BE', "olcross;": '\U000029BB', "oline;": '\U0000203E', "olt;": '\U000029C0', "omacr;": '\U0000014D', "omega;": '\U000003C9', "omicron;": '\U000003BF', "omid;": '\U000029B6', "ominus;": '\U00002296', "oopf;": '\U0001D560', "opar;": '\U000029B7', "operp;": '\U000029B9', "oplus;": '\U00002295', "or;": '\U00002228', "orarr;": '\U000021BB', "ord;": '\U00002A5D', "order;": '\U00002134', "orderof;": '\U00002134', "ordf;": '\U000000AA', "ordm;": '\U000000BA', "origof;": '\U000022B6', "oror;": '\U00002A56', "orslope;": '\U00002A57', "orv;": '\U00002A5B', "oscr;": '\U00002134', "oslash;": '\U000000F8', "osol;": '\U00002298', "otilde;": '\U000000F5', "otimes;": '\U00002297', "otimesas;": '\U00002A36', "ouml;": '\U000000F6', "ovbar;": '\U0000233D', "par;": '\U00002225', "para;": '\U000000B6', "parallel;": '\U00002225', "parsim;": '\U00002AF3', "parsl;": '\U00002AFD', "part;": '\U00002202', "pcy;": '\U0000043F', "percnt;": '\U00000025', "period;": '\U0000002E', "permil;": '\U00002030', "perp;": '\U000022A5', "pertenk;": '\U00002031', "pfr;": '\U0001D52D', "phi;": '\U000003C6', "phiv;": '\U000003D5', "phmmat;": '\U00002133', "phone;": '\U0000260E', "pi;": '\U000003C0', "pitchfork;": '\U000022D4', "piv;": '\U000003D6', "planck;": '\U0000210F', "planckh;": '\U0000210E', "plankv;": '\U0000210F', "plus;": '\U0000002B', "plusacir;": '\U00002A23', "plusb;": '\U0000229E', "pluscir;": '\U00002A22', "plusdo;": '\U00002214', "plusdu;": '\U00002A25', "pluse;": '\U00002A72', "plusmn;": '\U000000B1', "plussim;": '\U00002A26', "plustwo;": '\U00002A27', "pm;": '\U000000B1', "pointint;": '\U00002A15', "popf;": '\U0001D561', "pound;": '\U000000A3', "pr;": '\U0000227A', "prE;": '\U00002AB3', "prap;": '\U00002AB7', "prcue;": '\U0000227C', "pre;": '\U00002AAF', "prec;": '\U0000227A', "precapprox;": '\U00002AB7', "preccurlyeq;": '\U0000227C', "preceq;": '\U00002AAF', "precnapprox;": '\U00002AB9', "precneqq;": '\U00002AB5', "precnsim;": '\U000022E8', "precsim;": '\U0000227E', "prime;": '\U00002032', "primes;": '\U00002119', "prnE;": '\U00002AB5', "prnap;": '\U00002AB9', "prnsim;": '\U000022E8', "prod;": '\U0000220F', "profalar;": '\U0000232E', "profline;": '\U00002312', "profsurf;": '\U00002313', "prop;": '\U0000221D', "propto;": '\U0000221D', "prsim;": '\U0000227E', "prurel;": '\U000022B0', "pscr;": '\U0001D4C5', "psi;": '\U000003C8', "puncsp;": '\U00002008', "qfr;": '\U0001D52E', "qint;": '\U00002A0C', "qopf;": '\U0001D562', "qprime;": '\U00002057', "qscr;": '\U0001D4C6', "quaternions;": '\U0000210D', "quatint;": '\U00002A16', "quest;": '\U0000003F', "questeq;": '\U0000225F', "quot;": '\U00000022', "rAarr;": '\U000021DB', "rArr;": '\U000021D2', "rAtail;": '\U0000291C', "rBarr;": '\U0000290F', "rHar;": '\U00002964', "racute;": '\U00000155', "radic;": '\U0000221A', "raemptyv;": '\U000029B3', "rang;": '\U000027E9', "rangd;": '\U00002992', "range;": '\U000029A5', "rangle;": '\U000027E9', "raquo;": '\U000000BB', "rarr;": '\U00002192', "rarrap;": '\U00002975', "rarrb;": '\U000021E5', "rarrbfs;": '\U00002920', "rarrc;": '\U00002933', "rarrfs;": '\U0000291E', "rarrhk;": '\U000021AA', "rarrlp;": '\U000021AC', "rarrpl;": '\U00002945', "rarrsim;": '\U00002974', "rarrtl;": '\U000021A3', "rarrw;": '\U0000219D', "ratail;": '\U0000291A', "ratio;": '\U00002236', "rationals;": '\U0000211A', "rbarr;": '\U0000290D', "rbbrk;": '\U00002773', "rbrace;": '\U0000007D', "rbrack;": '\U0000005D', "rbrke;": '\U0000298C', "rbrksld;": '\U0000298E', "rbrkslu;": '\U00002990', "rcaron;": '\U00000159', "rcedil;": '\U00000157', "rceil;": '\U00002309', "rcub;": '\U0000007D', "rcy;": '\U00000440', "rdca;": '\U00002937', "rdldhar;": '\U00002969', "rdquo;": '\U0000201D', "rdquor;": '\U0000201D', "rdsh;": '\U000021B3', "real;": '\U0000211C', "realine;": '\U0000211B', "realpart;": '\U0000211C', "reals;": '\U0000211D', "rect;": '\U000025AD', "reg;": '\U000000AE', "rfisht;": '\U0000297D', "rfloor;": '\U0000230B', "rfr;": '\U0001D52F', "rhard;": '\U000021C1', "rharu;": '\U000021C0', "rharul;": '\U0000296C', "rho;": '\U000003C1', "rhov;": '\U000003F1', "rightarrow;": '\U00002192', "rightarrowtail;": '\U000021A3', "rightharpoondown;": '\U000021C1', "rightharpoonup;": '\U000021C0', "rightleftarrows;": '\U000021C4', "rightleftharpoons;": '\U000021CC', "rightrightarrows;": '\U000021C9', "rightsquigarrow;": '\U0000219D', "rightthreetimes;": '\U000022CC', "ring;": '\U000002DA', "risingdotseq;": '\U00002253', "rlarr;": '\U000021C4', "rlhar;": '\U000021CC', "rlm;": '\U0000200F', "rmoust;": '\U000023B1', "rmoustache;": '\U000023B1', "rnmid;": '\U00002AEE', "roang;": '\U000027ED', "roarr;": '\U000021FE', "robrk;": '\U000027E7', "ropar;": '\U00002986', "ropf;": '\U0001D563', "roplus;": '\U00002A2E', "rotimes;": '\U00002A35', "rpar;": '\U00000029', "rpargt;": '\U00002994', "rppolint;": '\U00002A12', "rrarr;": '\U000021C9', "rsaquo;": '\U0000203A', "rscr;": '\U0001D4C7', "rsh;": '\U000021B1', "rsqb;": '\U0000005D', "rsquo;": '\U00002019', "rsquor;": '\U00002019', "rthree;": '\U000022CC', "rtimes;": '\U000022CA', "rtri;": '\U000025B9', "rtrie;": '\U000022B5', "rtrif;": '\U000025B8', "rtriltri;": '\U000029CE', "ruluhar;": '\U00002968', "rx;": '\U0000211E', "sacute;": '\U0000015B', "sbquo;": '\U0000201A', "sc;": '\U0000227B', "scE;": '\U00002AB4', "scap;": '\U00002AB8', "scaron;": '\U00000161', "sccue;": '\U0000227D', "sce;": '\U00002AB0', "scedil;": '\U0000015F', "scirc;": '\U0000015D', "scnE;": '\U00002AB6', "scnap;": '\U00002ABA', "scnsim;": '\U000022E9', "scpolint;": '\U00002A13', "scsim;": '\U0000227F', "scy;": '\U00000441', "sdot;": '\U000022C5', "sdotb;": '\U000022A1', "sdote;": '\U00002A66', "seArr;": '\U000021D8', "searhk;": '\U00002925', "searr;": '\U00002198', "searrow;": '\U00002198', "sect;": '\U000000A7', "semi;": '\U0000003B', "seswar;": '\U00002929', "setminus;": '\U00002216', "setmn;": '\U00002216', "sext;": '\U00002736', "sfr;": '\U0001D530', "sfrown;": '\U00002322', "sharp;": '\U0000266F', "shchcy;": '\U00000449', "shcy;": '\U00000448', "shortmid;": '\U00002223', "shortparallel;": '\U00002225', "shy;": '\U000000AD', "sigma;": '\U000003C3', "sigmaf;": '\U000003C2', "sigmav;": '\U000003C2', "sim;": '\U0000223C', "simdot;": '\U00002A6A', "sime;": '\U00002243', "simeq;": '\U00002243', "simg;": '\U00002A9E', "simgE;": '\U00002AA0', "siml;": '\U00002A9D', "simlE;": '\U00002A9F', "simne;": '\U00002246', "simplus;": '\U00002A24', "simrarr;": '\U00002972', "slarr;": '\U00002190', "smallsetminus;": '\U00002216', "smashp;": '\U00002A33', "smeparsl;": '\U000029E4', "smid;": '\U00002223', "smile;": '\U00002323', "smt;": '\U00002AAA', "smte;": '\U00002AAC', "softcy;": '\U0000044C', "sol;": '\U0000002F', "solb;": '\U000029C4', "solbar;": '\U0000233F', "sopf;": '\U0001D564', "spades;": '\U00002660', "spadesuit;": '\U00002660', "spar;": '\U00002225', "sqcap;": '\U00002293', "sqcup;": '\U00002294', "sqsub;": '\U0000228F', "sqsube;": '\U00002291', "sqsubset;": '\U0000228F', "sqsubseteq;": '\U00002291', "sqsup;": '\U00002290', "sqsupe;": '\U00002292', "sqsupset;": '\U00002290', "sqsupseteq;": '\U00002292', "squ;": '\U000025A1', "square;": '\U000025A1', "squarf;": '\U000025AA', "squf;": '\U000025AA', "srarr;": '\U00002192', "sscr;": '\U0001D4C8', "ssetmn;": '\U00002216', "ssmile;": '\U00002323', "sstarf;": '\U000022C6', "star;": '\U00002606', "starf;": '\U00002605', "straightepsilon;": '\U000003F5', "straightphi;": '\U000003D5', "strns;": '\U000000AF', "sub;": '\U00002282', "subE;": '\U00002AC5', "subdot;": '\U00002ABD', "sube;": '\U00002286', "subedot;": '\U00002AC3', "submult;": '\U00002AC1', "subnE;": '\U00002ACB', "subne;": '\U0000228A', "subplus;": '\U00002ABF', "subrarr;": '\U00002979', "subset;": '\U00002282', "subseteq;": '\U00002286', "subseteqq;": '\U00002AC5', "subsetneq;": '\U0000228A', "subsetneqq;": '\U00002ACB', "subsim;": '\U00002AC7', "subsub;": '\U00002AD5', "subsup;": '\U00002AD3', "succ;": '\U0000227B', "succapprox;": '\U00002AB8', "succcurlyeq;": '\U0000227D', "succeq;": '\U00002AB0', "succnapprox;": '\U00002ABA', "succneqq;": '\U00002AB6', "succnsim;": '\U000022E9', "succsim;": '\U0000227F', "sum;": '\U00002211', "sung;": '\U0000266A', "sup;": '\U00002283', "sup1;": '\U000000B9', "sup2;": '\U000000B2', "sup3;": '\U000000B3', "supE;": '\U00002AC6', "supdot;": '\U00002ABE', "supdsub;": '\U00002AD8', "supe;": '\U00002287', "supedot;": '\U00002AC4', "suphsol;": '\U000027C9', "suphsub;": '\U00002AD7', "suplarr;": '\U0000297B', "supmult;": '\U00002AC2', "supnE;": '\U00002ACC', "supne;": '\U0000228B', "supplus;": '\U00002AC0', "supset;": '\U00002283', "supseteq;": '\U00002287', "supseteqq;": '\U00002AC6', "supsetneq;": '\U0000228B', "supsetneqq;": '\U00002ACC', "supsim;": '\U00002AC8', "supsub;": '\U00002AD4', "supsup;": '\U00002AD6', "swArr;": '\U000021D9', "swarhk;": '\U00002926', "swarr;": '\U00002199', "swarrow;": '\U00002199', "swnwar;": '\U0000292A', "szlig;": '\U000000DF', "target;": '\U00002316', "tau;": '\U000003C4', "tbrk;": '\U000023B4', "tcaron;": '\U00000165', "tcedil;": '\U00000163', "tcy;": '\U00000442', "tdot;": '\U000020DB', "telrec;": '\U00002315', "tfr;": '\U0001D531', "there4;": '\U00002234', "therefore;": '\U00002234', "theta;": '\U000003B8', "thetasym;": '\U000003D1', "thetav;": '\U000003D1', "thickapprox;": '\U00002248', "thicksim;": '\U0000223C', "thinsp;": '\U00002009', "thkap;": '\U00002248', "thksim;": '\U0000223C', "thorn;": '\U000000FE', "tilde;": '\U000002DC', "times;": '\U000000D7', "timesb;": '\U000022A0', "timesbar;": '\U00002A31', "timesd;": '\U00002A30', "tint;": '\U0000222D', "toea;": '\U00002928', "top;": '\U000022A4', "topbot;": '\U00002336', "topcir;": '\U00002AF1', "topf;": '\U0001D565', "topfork;": '\U00002ADA', "tosa;": '\U00002929', "tprime;": '\U00002034', "trade;": '\U00002122', "triangle;": '\U000025B5', "triangledown;": '\U000025BF', "triangleleft;": '\U000025C3', "trianglelefteq;": '\U000022B4', "triangleq;": '\U0000225C', "triangleright;": '\U000025B9', "trianglerighteq;": '\U000022B5', "tridot;": '\U000025EC', "trie;": '\U0000225C', "triminus;": '\U00002A3A', "triplus;": '\U00002A39', "trisb;": '\U000029CD', "tritime;": '\U00002A3B', "trpezium;": '\U000023E2', "tscr;": '\U0001D4C9', "tscy;": '\U00000446', "tshcy;": '\U0000045B', "tstrok;": '\U00000167', "twixt;": '\U0000226C', "twoheadleftarrow;": '\U0000219E', "twoheadrightarrow;": '\U000021A0', "uArr;": '\U000021D1', "uHar;": '\U00002963', "uacute;": '\U000000FA', "uarr;": '\U00002191', "ubrcy;": '\U0000045E', "ubreve;": '\U0000016D', "ucirc;": '\U000000FB', "ucy;": '\U00000443', "udarr;": '\U000021C5', "udblac;": '\U00000171', "udhar;": '\U0000296E', "ufisht;": '\U0000297E', "ufr;": '\U0001D532', "ugrave;": '\U000000F9', "uharl;": '\U000021BF', "uharr;": '\U000021BE', "uhblk;": '\U00002580', "ulcorn;": '\U0000231C', "ulcorner;": '\U0000231C', "ulcrop;": '\U0000230F', "ultri;": '\U000025F8', "umacr;": '\U0000016B', "uml;": '\U000000A8', "uogon;": '\U00000173', "uopf;": '\U0001D566', "uparrow;": '\U00002191', "updownarrow;": '\U00002195', "upharpoonleft;": '\U000021BF', "upharpoonright;": '\U000021BE', "uplus;": '\U0000228E', "upsi;": '\U000003C5', "upsih;": '\U000003D2', "upsilon;": '\U000003C5', "upuparrows;": '\U000021C8', "urcorn;": '\U0000231D', "urcorner;": '\U0000231D', "urcrop;": '\U0000230E', "uring;": '\U0000016F', "urtri;": '\U000025F9', "uscr;": '\U0001D4CA', "utdot;": '\U000022F0', "utilde;": '\U00000169', "utri;": '\U000025B5', "utrif;": '\U000025B4', "uuarr;": '\U000021C8', "uuml;": '\U000000FC', "uwangle;": '\U000029A7', "vArr;": '\U000021D5', "vBar;": '\U00002AE8', "vBarv;": '\U00002AE9', "vDash;": '\U000022A8', "vangrt;": '\U0000299C', "varepsilon;": '\U000003F5', "varkappa;": '\U000003F0', "varnothing;": '\U00002205', "varphi;": '\U000003D5', "varpi;": '\U000003D6', "varpropto;": '\U0000221D', "varr;": '\U00002195', "varrho;": '\U000003F1', "varsigma;": '\U000003C2', "vartheta;": '\U000003D1', "vartriangleleft;": '\U000022B2', "vartriangleright;": '\U000022B3', "vcy;": '\U00000432', "vdash;": '\U000022A2', "vee;": '\U00002228', "veebar;": '\U000022BB', "veeeq;": '\U0000225A', "vellip;": '\U000022EE', "verbar;": '\U0000007C', "vert;": '\U0000007C', "vfr;": '\U0001D533', "vltri;": '\U000022B2', "vopf;": '\U0001D567', "vprop;": '\U0000221D', "vrtri;": '\U000022B3', "vscr;": '\U0001D4CB', "vzigzag;": '\U0000299A', "wcirc;": '\U00000175', "wedbar;": '\U00002A5F', "wedge;": '\U00002227', "wedgeq;": '\U00002259', "weierp;": '\U00002118', "wfr;": '\U0001D534', "wopf;": '\U0001D568', "wp;": '\U00002118', "wr;": '\U00002240', "wreath;": '\U00002240', "wscr;": '\U0001D4CC', "xcap;": '\U000022C2', "xcirc;": '\U000025EF', "xcup;": '\U000022C3', "xdtri;": '\U000025BD', "xfr;": '\U0001D535', "xhArr;": '\U000027FA', "xharr;": '\U000027F7', "xi;": '\U000003BE', "xlArr;": '\U000027F8', "xlarr;": '\U000027F5', "xmap;": '\U000027FC', "xnis;": '\U000022FB', "xodot;": '\U00002A00', "xopf;": '\U0001D569', "xoplus;": '\U00002A01', "xotime;": '\U00002A02', "xrArr;": '\U000027F9', "xrarr;": '\U000027F6', "xscr;": '\U0001D4CD', "xsqcup;": '\U00002A06', "xuplus;": '\U00002A04', "xutri;": '\U000025B3', "xvee;": '\U000022C1', "xwedge;": '\U000022C0', "yacute;": '\U000000FD', "yacy;": '\U0000044F', "ycirc;": '\U00000177', "ycy;": '\U0000044B', "yen;": '\U000000A5', "yfr;": '\U0001D536', "yicy;": '\U00000457', "yopf;": '\U0001D56A', "yscr;": '\U0001D4CE', "yucy;": '\U0000044E', "yuml;": '\U000000FF', "zacute;": '\U0000017A', "zcaron;": '\U0000017E', "zcy;": '\U00000437', "zdot;": '\U0000017C', "zeetrf;": '\U00002128', "zeta;": '\U000003B6', "zfr;": '\U0001D537', "zhcy;": '\U00000436', "zigrarr;": '\U000021DD', "zopf;": '\U0001D56B', "zscr;": '\U0001D4CF', "zwj;": '\U0000200D', "zwnj;": '\U0000200C', "AElig": '\U000000C6', "AMP": '\U00000026', "Aacute": '\U000000C1', "Acirc": '\U000000C2', "Agrave": '\U000000C0', "Aring": '\U000000C5', "Atilde": '\U000000C3', "Auml": '\U000000C4', "COPY": '\U000000A9', "Ccedil": '\U000000C7', "ETH": '\U000000D0', "Eacute": '\U000000C9', "Ecirc": '\U000000CA', "Egrave": '\U000000C8', "Euml": '\U000000CB', "GT": '\U0000003E', "Iacute": '\U000000CD', "Icirc": '\U000000CE', "Igrave": '\U000000CC', "Iuml": '\U000000CF', "LT": '\U0000003C', "Ntilde": '\U000000D1', "Oacute": '\U000000D3', "Ocirc": '\U000000D4', "Ograve": '\U000000D2', "Oslash": '\U000000D8', "Otilde": '\U000000D5', "Ouml": '\U000000D6', "QUOT": '\U00000022', "REG": '\U000000AE', "THORN": '\U000000DE', "Uacute": '\U000000DA', "Ucirc": '\U000000DB', "Ugrave": '\U000000D9', "Uuml": '\U000000DC', "Yacute": '\U000000DD', "aacute": '\U000000E1', "acirc": '\U000000E2', "acute": '\U000000B4', "aelig": '\U000000E6', "agrave": '\U000000E0', "amp": '\U00000026', "aring": '\U000000E5', "atilde": '\U000000E3', "auml": '\U000000E4', "brvbar": '\U000000A6', "ccedil": '\U000000E7', "cedil": '\U000000B8', "cent": '\U000000A2', "copy": '\U000000A9', "curren": '\U000000A4', "deg": '\U000000B0', "divide": '\U000000F7', "eacute": '\U000000E9', "ecirc": '\U000000EA', "egrave": '\U000000E8', "eth": '\U000000F0', "euml": '\U000000EB', "frac12": '\U000000BD', "frac14": '\U000000BC', "frac34": '\U000000BE', "gt": '\U0000003E', "iacute": '\U000000ED', "icirc": '\U000000EE', "iexcl": '\U000000A1', "igrave": '\U000000EC', "iquest": '\U000000BF', "iuml": '\U000000EF', "laquo": '\U000000AB', "lt": '\U0000003C', "macr": '\U000000AF', "micro": '\U000000B5', "middot": '\U000000B7', "nbsp": '\U000000A0', "not": '\U000000AC', "ntilde": '\U000000F1', "oacute": '\U000000F3', "ocirc": '\U000000F4', "ograve": '\U000000F2', "ordf": '\U000000AA', "ordm": '\U000000BA', "oslash": '\U000000F8', "otilde": '\U000000F5', "ouml": '\U000000F6', "para": '\U000000B6', "plusmn": '\U000000B1', "pound": '\U000000A3', "quot": '\U00000022', "raquo": '\U000000BB', "reg": '\U000000AE', "sect": '\U000000A7', "shy": '\U000000AD', "sup1": '\U000000B9', "sup2": '\U000000B2', "sup3": '\U000000B3', "szlig": '\U000000DF', "thorn": '\U000000FE', "times": '\U000000D7', "uacute": '\U000000FA', "ucirc": '\U000000FB', "ugrave": '\U000000F9', "uml": '\U000000A8', "uuml": '\U000000FC', "yacute": '\U000000FD', "yen": '\U000000A5', "yuml": '\U000000FF', } // HTML entities that are two unicode codepoints. var entity2 = map[string][2]rune{ // TODO(nigeltao): Handle replacements that are wider than their names. // "nLt;": {'\u226A', '\u20D2'}, // "nGt;": {'\u226B', '\u20D2'}, "NotEqualTilde;": {'\u2242', '\u0338'}, "NotGreaterFullEqual;": {'\u2267', '\u0338'}, "NotGreaterGreater;": {'\u226B', '\u0338'}, "NotGreaterSlantEqual;": {'\u2A7E', '\u0338'}, "NotHumpDownHump;": {'\u224E', '\u0338'}, "NotHumpEqual;": {'\u224F', '\u0338'}, "NotLeftTriangleBar;": {'\u29CF', '\u0338'}, "NotLessLess;": {'\u226A', '\u0338'}, "NotLessSlantEqual;": {'\u2A7D', '\u0338'}, "NotNestedGreaterGreater;": {'\u2AA2', '\u0338'}, "NotNestedLessLess;": {'\u2AA1', '\u0338'}, "NotPrecedesEqual;": {'\u2AAF', '\u0338'}, "NotRightTriangleBar;": {'\u29D0', '\u0338'}, "NotSquareSubset;": {'\u228F', '\u0338'}, "NotSquareSuperset;": {'\u2290', '\u0338'}, "NotSubset;": {'\u2282', '\u20D2'}, "NotSucceedsEqual;": {'\u2AB0', '\u0338'}, "NotSucceedsTilde;": {'\u227F', '\u0338'}, "NotSuperset;": {'\u2283', '\u20D2'}, "ThickSpace;": {'\u205F', '\u200A'}, "acE;": {'\u223E', '\u0333'}, "bne;": {'\u003D', '\u20E5'}, "bnequiv;": {'\u2261', '\u20E5'}, "caps;": {'\u2229', '\uFE00'}, "cups;": {'\u222A', '\uFE00'}, "fjlig;": {'\u0066', '\u006A'}, "gesl;": {'\u22DB', '\uFE00'}, "gvertneqq;": {'\u2269', '\uFE00'}, "gvnE;": {'\u2269', '\uFE00'}, "lates;": {'\u2AAD', '\uFE00'}, "lesg;": {'\u22DA', '\uFE00'}, "lvertneqq;": {'\u2268', '\uFE00'}, "lvnE;": {'\u2268', '\uFE00'}, "nGg;": {'\u22D9', '\u0338'}, "nGtv;": {'\u226B', '\u0338'}, "nLl;": {'\u22D8', '\u0338'}, "nLtv;": {'\u226A', '\u0338'}, "nang;": {'\u2220', '\u20D2'}, "napE;": {'\u2A70', '\u0338'}, "napid;": {'\u224B', '\u0338'}, "nbump;": {'\u224E', '\u0338'}, "nbumpe;": {'\u224F', '\u0338'}, "ncongdot;": {'\u2A6D', '\u0338'}, "nedot;": {'\u2250', '\u0338'}, "nesim;": {'\u2242', '\u0338'}, "ngE;": {'\u2267', '\u0338'}, "ngeqq;": {'\u2267', '\u0338'}, "ngeqslant;": {'\u2A7E', '\u0338'}, "nges;": {'\u2A7E', '\u0338'}, "nlE;": {'\u2266', '\u0338'}, "nleqq;": {'\u2266', '\u0338'}, "nleqslant;": {'\u2A7D', '\u0338'}, "nles;": {'\u2A7D', '\u0338'}, "notinE;": {'\u22F9', '\u0338'}, "notindot;": {'\u22F5', '\u0338'}, "nparsl;": {'\u2AFD', '\u20E5'}, "npart;": {'\u2202', '\u0338'}, "npre;": {'\u2AAF', '\u0338'}, "npreceq;": {'\u2AAF', '\u0338'}, "nrarrc;": {'\u2933', '\u0338'}, "nrarrw;": {'\u219D', '\u0338'}, "nsce;": {'\u2AB0', '\u0338'}, "nsubE;": {'\u2AC5', '\u0338'}, "nsubset;": {'\u2282', '\u20D2'}, "nsubseteqq;": {'\u2AC5', '\u0338'}, "nsucceq;": {'\u2AB0', '\u0338'}, "nsupE;": {'\u2AC6', '\u0338'}, "nsupset;": {'\u2283', '\u20D2'}, "nsupseteqq;": {'\u2AC6', '\u0338'}, "nvap;": {'\u224D', '\u20D2'}, "nvge;": {'\u2265', '\u20D2'}, "nvgt;": {'\u003E', '\u20D2'}, "nvle;": {'\u2264', '\u20D2'}, "nvlt;": {'\u003C', '\u20D2'}, "nvltrie;": {'\u22B4', '\u20D2'}, "nvrtrie;": {'\u22B5', '\u20D2'}, "nvsim;": {'\u223C', '\u20D2'}, "race;": {'\u223D', '\u0331'}, "smtes;": {'\u2AAC', '\uFE00'}, "sqcaps;": {'\u2293', '\uFE00'}, "sqcups;": {'\u2294', '\uFE00'}, "varsubsetneq;": {'\u228A', '\uFE00'}, "varsubsetneqq;": {'\u2ACB', '\uFE00'}, "varsupsetneq;": {'\u228B', '\uFE00'}, "varsupsetneqq;": {'\u2ACC', '\uFE00'}, "vnsub;": {'\u2282', '\u20D2'}, "vnsup;": {'\u2283', '\u20D2'}, "vsubnE;": {'\u2ACB', '\uFE00'}, "vsubne;": {'\u228A', '\uFE00'}, "vsupnE;": {'\u2ACC', '\uFE00'}, "vsupne;": {'\u228B', '\uFE00'}, } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/entity_test.go��������������������������������������������������������������������������0000644�0001751�0001751�00000001776�12235217213�015203� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package html import ( "testing" "unicode/utf8" ) func TestEntityLength(t *testing.T) { // We verify that the length of UTF-8 encoding of each value is <= 1 + len(key). // The +1 comes from the leading "&". This property implies that the length of // unescaped text is <= the length of escaped text. for k, v := range entity { if 1+len(k) < utf8.RuneLen(v) { t.Error("escaped entity &" + k + " is shorter than its UTF-8 encoding " + string(v)) } if len(k) > longestEntityWithoutSemicolon && k[len(k)-1] != ';' { t.Errorf("entity name %s is %d characters, but longestEntityWithoutSemicolon=%d", k, len(k), longestEntityWithoutSemicolon) } } for k, v := range entity2 { if 1+len(k) < utf8.RuneLen(v[0])+utf8.RuneLen(v[1]) { t.Error("escaped entity &" + k + " is shorter than its UTF-8 encoding " + string(v[0]) + string(v[1])) } } } ��go.net/html/node.go���������������������������������������������������������������������������������0000644�0001751�0001751�00000011353�12235217213�013545� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package html import ( "code.google.com/p/go.net/html/atom" ) // A NodeType is the type of a Node. type NodeType uint32 const ( ErrorNode NodeType = iota TextNode DocumentNode ElementNode CommentNode DoctypeNode scopeMarkerNode ) // Section 12.2.3.3 says "scope markers are inserted when entering applet // elements, buttons, object elements, marquees, table cells, and table // captions, and are used to prevent formatting from 'leaking'". var scopeMarker = Node{Type: scopeMarkerNode} // A Node consists of a NodeType and some Data (tag name for element nodes, // content for text) and are part of a tree of Nodes. Element nodes may also // have a Namespace and contain a slice of Attributes. Data is unescaped, so // that it looks like "a<b" rather than "a&lt;b". For element nodes, DataAtom // is the atom for Data, or zero if Data is not a known tag name. // // An empty Namespace implies a "http://www.w3.org/1999/xhtml" namespace. // Similarly, "math" is short for "http://www.w3.org/1998/Math/MathML", and // "svg" is short for "http://www.w3.org/2000/svg". type Node struct { Parent, FirstChild, LastChild, PrevSibling, NextSibling *Node Type NodeType DataAtom atom.Atom Data string Namespace string Attr []Attribute } // InsertBefore inserts newChild as a child of n, immediately before oldChild // in the sequence of n's children. oldChild may be nil, in which case newChild // is appended to the end of n's children. // // It will panic if newChild already has a parent or siblings. func (n *Node) InsertBefore(newChild, oldChild *Node) { if newChild.Parent != nil || newChild.PrevSibling != nil || newChild.NextSibling != nil { panic("html: InsertBefore called for an attached child Node") } var prev, next *Node if oldChild != nil { prev, next = oldChild.PrevSibling, oldChild } else { prev = n.LastChild } if prev != nil { prev.NextSibling = newChild } else { n.FirstChild = newChild } if next != nil { next.PrevSibling = newChild } else { n.LastChild = newChild } newChild.Parent = n newChild.PrevSibling = prev newChild.NextSibling = next } // AppendChild adds a node c as a child of n. // // It will panic if c already has a parent or siblings. func (n *Node) AppendChild(c *Node) { if c.Parent != nil || c.PrevSibling != nil || c.NextSibling != nil { panic("html: AppendChild called for an attached child Node") } last := n.LastChild if last != nil { last.NextSibling = c } else { n.FirstChild = c } n.LastChild = c c.Parent = n c.PrevSibling = last } // RemoveChild removes a node c that is a child of n. Afterwards, c will have // no parent and no siblings. // // It will panic if c's parent is not n. func (n *Node) RemoveChild(c *Node) { if c.Parent != n { panic("html: RemoveChild called for a non-child Node") } if n.FirstChild == c { n.FirstChild = c.NextSibling } if c.NextSibling != nil { c.NextSibling.PrevSibling = c.PrevSibling } if n.LastChild == c { n.LastChild = c.PrevSibling } if c.PrevSibling != nil { c.PrevSibling.NextSibling = c.NextSibling } c.Parent = nil c.PrevSibling = nil c.NextSibling = nil } // reparentChildren reparents all of src's child nodes to dst. func reparentChildren(dst, src *Node) { for { child := src.FirstChild if child == nil { break } src.RemoveChild(child) dst.AppendChild(child) } } // clone returns a new node with the same type, data and attributes. // The clone has no parent, no siblings and no children. func (n *Node) clone() *Node { m := &Node{ Type: n.Type, DataAtom: n.DataAtom, Data: n.Data, Attr: make([]Attribute, len(n.Attr)), } copy(m.Attr, n.Attr) return m } // nodeStack is a stack of nodes. type nodeStack []*Node // pop pops the stack. It will panic if s is empty. func (s *nodeStack) pop() *Node { i := len(*s) n := (*s)[i-1] *s = (*s)[:i-1] return n } // top returns the most recently pushed node, or nil if s is empty. func (s *nodeStack) top() *Node { if i := len(*s); i > 0 { return (*s)[i-1] } return nil } // index returns the index of the top-most occurrence of n in the stack, or -1 // if n is not present. func (s *nodeStack) index(n *Node) int { for i := len(*s) - 1; i >= 0; i-- { if (*s)[i] == n { return i } } return -1 } // insert inserts a node at the given index. func (s *nodeStack) insert(i int, n *Node) { (*s) = append(*s, nil) copy((*s)[i+1:], (*s)[i:]) (*s)[i] = n } // remove removes a node from the stack. It is a no-op if n is not present. func (s *nodeStack) remove(n *Node) { i := s.index(n) if i == -1 { return } copy((*s)[i:], (*s)[i+1:]) j := len(*s) - 1 (*s)[j] = nil *s = (*s)[:j] } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/doc.go����������������������������������������������������������������������������������0000644�0001751�0001751�00000006477�12235217213�013400� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. /* Package html implements an HTML5-compliant tokenizer and parser. Tokenization is done by creating a Tokenizer for an io.Reader r. It is the caller's responsibility to ensure that r provides UTF-8 encoded HTML. z := html.NewTokenizer(r) Given a Tokenizer z, the HTML is tokenized by repeatedly calling z.Next(), which parses the next token and returns its type, or an error: for { tt := z.Next() if tt == html.ErrorToken { // ... return ... } // Process the current token. } There are two APIs for retrieving the current token. The high-level API is to call Token; the low-level API is to call Text or TagName / TagAttr. Both APIs allow optionally calling Raw after Next but before Token, Text, TagName, or TagAttr. In EBNF notation, the valid call sequence per token is: Next {Raw} [ Token | Text | TagName {TagAttr} ] Token returns an independent data structure that completely describes a token. Entities (such as "&lt;") are unescaped, tag names and attribute keys are lower-cased, and attributes are collected into a []Attribute. For example: for { if z.Next() == html.ErrorToken { // Returning io.EOF indicates success. return z.Err() } emitToken(z.Token()) } The low-level API performs fewer allocations and copies, but the contents of the []byte values returned by Text, TagName and TagAttr may change on the next call to Next. For example, to extract an HTML page's anchor text: depth := 0 for { tt := z.Next() switch tt { case ErrorToken: return z.Err() case TextToken: if depth > 0 { // emitBytes should copy the []byte it receives, // if it doesn't process it immediately. emitBytes(z.Text()) } case StartTagToken, EndTagToken: tn, _ := z.TagName() if len(tn) == 1 && tn[0] == 'a' { if tt == StartTagToken { depth++ } else { depth-- } } } } Parsing is done by calling Parse with an io.Reader, which returns the root of the parse tree (the document element) as a *Node. It is the caller's responsibility to ensure that the Reader provides UTF-8 encoded HTML. For example, to process each anchor node in depth-first order: doc, err := html.Parse(r) if err != nil { // ... } var f func(*html.Node) f = func(n *html.Node) { if n.Type == html.ElementNode && n.Data == "a" { // Do something with n... } for c := n.FirstChild; c != nil; c = c.NextSibling { f(c) } } f(doc) The relevant specifications include: http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html and http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html */ package html // The tokenization algorithm implemented by this package is not a line-by-line // transliteration of the relatively verbose state-machine in the WHATWG // specification. A more direct approach is used instead, where the program // counter implies the state, such as whether it is tokenizing a tag or a text // node. Specification compliance is verified by checking expected and actual // outputs over a test suite rather than aiming for algorithmic fidelity. // TODO(nigeltao): Does a DOM API belong in this package or a separate one? // TODO(nigeltao): How does parsing interact with a JavaScript engine? �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/token.go��������������������������������������������������������������������������������0000644�0001751�0001751�00000071573�12235217213�013752� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package html import ( "bytes" "io" "strconv" "strings" "code.google.com/p/go.net/html/atom" ) // A TokenType is the type of a Token. type TokenType uint32 const ( // ErrorToken means that an error occurred during tokenization. ErrorToken TokenType = iota // TextToken means a text node. TextToken // A StartTagToken looks like <a>. StartTagToken // An EndTagToken looks like </a>. EndTagToken // A SelfClosingTagToken tag looks like <br/>. SelfClosingTagToken // A CommentToken looks like <!--x-->. CommentToken // A DoctypeToken looks like <!DOCTYPE x> DoctypeToken ) // String returns a string representation of the TokenType. func (t TokenType) String() string { switch t { case ErrorToken: return "Error" case TextToken: return "Text" case StartTagToken: return "StartTag" case EndTagToken: return "EndTag" case SelfClosingTagToken: return "SelfClosingTag" case CommentToken: return "Comment" case DoctypeToken: return "Doctype" } return "Invalid(" + strconv.Itoa(int(t)) + ")" } // An Attribute is an attribute namespace-key-value triple. Namespace is // non-empty for foreign attributes like xlink, Key is alphabetic (and hence // does not contain escapable characters like '&', '<' or '>'), and Val is // unescaped (it looks like "a<b" rather than "a&lt;b"). // // Namespace is only used by the parser, not the tokenizer. type Attribute struct { Namespace, Key, Val string } // A Token consists of a TokenType and some Data (tag name for start and end // tags, content for text, comments and doctypes). A tag Token may also contain // a slice of Attributes. Data is unescaped for all Tokens (it looks like "a<b" // rather than "a&lt;b"). For tag Tokens, DataAtom is the atom for Data, or // zero if Data is not a known tag name. type Token struct { Type TokenType DataAtom atom.Atom Data string Attr []Attribute } // tagString returns a string representation of a tag Token's Data and Attr. func (t Token) tagString() string { if len(t.Attr) == 0 { return t.Data } buf := bytes.NewBufferString(t.Data) for _, a := range t.Attr { buf.WriteByte(' ') buf.WriteString(a.Key) buf.WriteString(`="`) escape(buf, a.Val) buf.WriteByte('"') } return buf.String() } // String returns a string representation of the Token. func (t Token) String() string { switch t.Type { case ErrorToken: return "" case TextToken: return EscapeString(t.Data) case StartTagToken: return "<" + t.tagString() + ">" case EndTagToken: return "</" + t.tagString() + ">" case SelfClosingTagToken: return "<" + t.tagString() + "/>" case CommentToken: return "<!--" + t.Data + "-->" case DoctypeToken: return "<!DOCTYPE " + t.Data + ">" } return "Invalid(" + strconv.Itoa(int(t.Type)) + ")" } // span is a range of bytes in a Tokenizer's buffer. The start is inclusive, // the end is exclusive. type span struct { start, end int } // A Tokenizer returns a stream of HTML Tokens. type Tokenizer struct { // r is the source of the HTML text. r io.Reader // tt is the TokenType of the current token. tt TokenType // err is the first error encountered during tokenization. It is possible // for tt != Error && err != nil to hold: this means that Next returned a // valid token but the subsequent Next call will return an error token. // For example, if the HTML text input was just "plain", then the first // Next call would set z.err to io.EOF but return a TextToken, and all // subsequent Next calls would return an ErrorToken. // err is never reset. Once it becomes non-nil, it stays non-nil. err error // readErr is the error returned by the io.Reader r. It is separate from // err because it is valid for an io.Reader to return (n int, err1 error) // such that n > 0 && err1 != nil, and callers should always process the // n > 0 bytes before considering the error err1. readErr error // buf[raw.start:raw.end] holds the raw bytes of the current token. // buf[raw.end:] is buffered input that will yield future tokens. raw span buf []byte // buf[data.start:data.end] holds the raw bytes of the current token's data: // a text token's text, a tag token's tag name, etc. data span // pendingAttr is the attribute key and value currently being tokenized. // When complete, pendingAttr is pushed onto attr. nAttrReturned is // incremented on each call to TagAttr. pendingAttr [2]span attr [][2]span nAttrReturned int // rawTag is the "script" in "</script>" that closes the next token. If // non-empty, the subsequent call to Next will return a raw or RCDATA text // token: one that treats "<p>" as text instead of an element. // rawTag's contents are lower-cased. rawTag string // textIsRaw is whether the current text token's data is not escaped. textIsRaw bool // convertNUL is whether NUL bytes in the current token's data should // be converted into \ufffd replacement characters. convertNUL bool // allowCDATA is whether CDATA sections are allowed in the current context. allowCDATA bool } // AllowCDATA sets whether or not the tokenizer recognizes <![CDATA[foo]]> as // the text "foo". The default value is false, which means to recognize it as // a bogus comment "<!-- [CDATA[foo]] -->" instead. // // Strictly speaking, an HTML5 compliant tokenizer should allow CDATA if and // only if tokenizing foreign content, such as MathML and SVG. However, // tracking foreign-contentness is difficult to do purely in the tokenizer, // as opposed to the parser, due to HTML integration points: an <svg> element // can contain a <foreignObject> that is foreign-to-SVG but not foreign-to- // HTML. For strict compliance with the HTML5 tokenization algorithm, it is the // responsibility of the user of a tokenizer to call AllowCDATA as appropriate. // In practice, if using the tokenizer without caring whether MathML or SVG // CDATA is text or comments, such as tokenizing HTML to find all the anchor // text, it is acceptable to ignore this responsibility. func (z *Tokenizer) AllowCDATA(allowCDATA bool) { z.allowCDATA = allowCDATA } // NextIsNotRawText instructs the tokenizer that the next token should not be // considered as 'raw text'. Some elements, such as script and title elements, // normally require the next token after the opening tag to be 'raw text' that // has no child elements. For example, tokenizing "<title>a<b>c</b>d</title>" // yields a start tag token for "<title>", a text token for "a<b>c</b>d", and // an end tag token for "</title>". There are no distinct start tag or end tag // tokens for the "<b>" and "</b>". // // This tokenizer implementation will generally look for raw text at the right // times. Strictly speaking, an HTML5 compliant tokenizer should not look for // raw text if in foreign content: <title> generally needs raw text, but a // <title> inside an <svg> does not. Another example is that a <textarea> // generally needs raw text, but a <textarea> is not allowed as an immediate // child of a <select>; in normal parsing, a <textarea> implies </select>, but // one cannot close the implicit element when parsing a <select>'s InnerHTML. // Similarly to AllowCDATA, tracking the correct moment to override raw-text- // ness is difficult to do purely in the tokenizer, as opposed to the parser. // For strict compliance with the HTML5 tokenization algorithm, it is the // responsibility of the user of a tokenizer to call NextIsNotRawText as // appropriate. In practice, like AllowCDATA, it is acceptable to ignore this // responsibility for basic usage. // // Note that this 'raw text' concept is different from the one offered by the // Tokenizer.Raw method. func (z *Tokenizer) NextIsNotRawText() { z.rawTag = "" } // Err returns the error associated with the most recent ErrorToken token. // This is typically io.EOF, meaning the end of tokenization. func (z *Tokenizer) Err() error { if z.tt != ErrorToken { return nil } return z.err } // readByte returns the next byte from the input stream, doing a buffered read // from z.r into z.buf if necessary. z.buf[z.raw.start:z.raw.end] remains a contiguous byte // slice that holds all the bytes read so far for the current token. // It sets z.err if the underlying reader returns an error. // Pre-condition: z.err == nil. func (z *Tokenizer) readByte() byte { if z.raw.end >= len(z.buf) { // Our buffer is exhausted and we have to read from z.r. Check if the // previous read resulted in an error. if z.readErr != nil { z.err = z.readErr return 0 } // We copy z.buf[z.raw.start:z.raw.end] to the beginning of z.buf. If the length // z.raw.end - z.raw.start is more than half the capacity of z.buf, then we // allocate a new buffer before the copy. c := cap(z.buf) d := z.raw.end - z.raw.start var buf1 []byte if 2*d > c { buf1 = make([]byte, d, 2*c) } else { buf1 = z.buf[:d] } copy(buf1, z.buf[z.raw.start:z.raw.end]) if x := z.raw.start; x != 0 { // Adjust the data/attr spans to refer to the same contents after the copy. z.data.start -= x z.data.end -= x z.pendingAttr[0].start -= x z.pendingAttr[0].end -= x z.pendingAttr[1].start -= x z.pendingAttr[1].end -= x for i := range z.attr { z.attr[i][0].start -= x z.attr[i][0].end -= x z.attr[i][1].start -= x z.attr[i][1].end -= x } } z.raw.start, z.raw.end, z.buf = 0, d, buf1[:d] // Now that we have copied the live bytes to the start of the buffer, // we read from z.r into the remainder. var n int n, z.readErr = readAtLeastOneByte(z.r, buf1[d:cap(buf1)]) if n == 0 { z.err = z.readErr return 0 } z.buf = buf1[:d+n] } x := z.buf[z.raw.end] z.raw.end++ return x } // readAtLeastOneByte wraps an io.Reader so that reading cannot return (0, nil). // It returns io.ErrNoProgress if the underlying r.Read method returns (0, nil) // too many times in succession. func readAtLeastOneByte(r io.Reader, b []byte) (int, error) { for i := 0; i < 100; i++ { n, err := r.Read(b) if n != 0 || err != nil { return n, err } } return 0, io.ErrNoProgress } // skipWhiteSpace skips past any white space. func (z *Tokenizer) skipWhiteSpace() { if z.err != nil { return } for { c := z.readByte() if z.err != nil { return } switch c { case ' ', '\n', '\r', '\t', '\f': // No-op. default: z.raw.end-- return } } } // readRawOrRCDATA reads until the next "</foo>", where "foo" is z.rawTag and // is typically something like "script" or "textarea". func (z *Tokenizer) readRawOrRCDATA() { if z.rawTag == "script" { z.readScript() z.textIsRaw = true z.rawTag = "" return } loop: for { c := z.readByte() if z.err != nil { break loop } if c != '<' { continue loop } c = z.readByte() if z.err != nil { break loop } if c != '/' { continue loop } if z.readRawEndTag() || z.err != nil { break loop } } z.data.end = z.raw.end // A textarea's or title's RCDATA can contain escaped entities. z.textIsRaw = z.rawTag != "textarea" && z.rawTag != "title" z.rawTag = "" } // readRawEndTag attempts to read a tag like "</foo>", where "foo" is z.rawTag. // If it succeeds, it backs up the input position to reconsume the tag and // returns true. Otherwise it returns false. The opening "</" has already been // consumed. func (z *Tokenizer) readRawEndTag() bool { for i := 0; i < len(z.rawTag); i++ { c := z.readByte() if z.err != nil { return false } if c != z.rawTag[i] && c != z.rawTag[i]-('a'-'A') { z.raw.end-- return false } } c := z.readByte() if z.err != nil { return false } switch c { case ' ', '\n', '\r', '\t', '\f', '/', '>': // The 3 is 2 for the leading "</" plus 1 for the trailing character c. z.raw.end -= 3 + len(z.rawTag) return true } z.raw.end-- return false } // readScript reads until the next </script> tag, following the byzantine // rules for escaping/hiding the closing tag. func (z *Tokenizer) readScript() { defer func() { z.data.end = z.raw.end }() var c byte scriptData: c = z.readByte() if z.err != nil { return } if c == '<' { goto scriptDataLessThanSign } goto scriptData scriptDataLessThanSign: c = z.readByte() if z.err != nil { return } switch c { case '/': goto scriptDataEndTagOpen case '!': goto scriptDataEscapeStart } z.raw.end-- goto scriptData scriptDataEndTagOpen: if z.readRawEndTag() || z.err != nil { return } goto scriptData scriptDataEscapeStart: c = z.readByte() if z.err != nil { return } if c == '-' { goto scriptDataEscapeStartDash } z.raw.end-- goto scriptData scriptDataEscapeStartDash: c = z.readByte() if z.err != nil { return } if c == '-' { goto scriptDataEscapedDashDash } z.raw.end-- goto scriptData scriptDataEscaped: c = z.readByte() if z.err != nil { return } switch c { case '-': goto scriptDataEscapedDash case '<': goto scriptDataEscapedLessThanSign } goto scriptDataEscaped scriptDataEscapedDash: c = z.readByte() if z.err != nil { return } switch c { case '-': goto scriptDataEscapedDashDash case '<': goto scriptDataEscapedLessThanSign } goto scriptDataEscaped scriptDataEscapedDashDash: c = z.readByte() if z.err != nil { return } switch c { case '-': goto scriptDataEscapedDashDash case '<': goto scriptDataEscapedLessThanSign case '>': goto scriptData } goto scriptDataEscaped scriptDataEscapedLessThanSign: c = z.readByte() if z.err != nil { return } if c == '/' { goto scriptDataEscapedEndTagOpen } if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' { goto scriptDataDoubleEscapeStart } z.raw.end-- goto scriptData scriptDataEscapedEndTagOpen: if z.readRawEndTag() || z.err != nil { return } goto scriptDataEscaped scriptDataDoubleEscapeStart: z.raw.end-- for i := 0; i < len("script"); i++ { c = z.readByte() if z.err != nil { return } if c != "script"[i] && c != "SCRIPT"[i] { z.raw.end-- goto scriptDataEscaped } } c = z.readByte() if z.err != nil { return } switch c { case ' ', '\n', '\r', '\t', '\f', '/', '>': goto scriptDataDoubleEscaped } z.raw.end-- goto scriptDataEscaped scriptDataDoubleEscaped: c = z.readByte() if z.err != nil { return } switch c { case '-': goto scriptDataDoubleEscapedDash case '<': goto scriptDataDoubleEscapedLessThanSign } goto scriptDataDoubleEscaped scriptDataDoubleEscapedDash: c = z.readByte() if z.err != nil { return } switch c { case '-': goto scriptDataDoubleEscapedDashDash case '<': goto scriptDataDoubleEscapedLessThanSign } goto scriptDataDoubleEscaped scriptDataDoubleEscapedDashDash: c = z.readByte() if z.err != nil { return } switch c { case '-': goto scriptDataDoubleEscapedDashDash case '<': goto scriptDataDoubleEscapedLessThanSign case '>': goto scriptData } goto scriptDataDoubleEscaped scriptDataDoubleEscapedLessThanSign: c = z.readByte() if z.err != nil { return } if c == '/' { goto scriptDataDoubleEscapeEnd } z.raw.end-- goto scriptDataDoubleEscaped scriptDataDoubleEscapeEnd: if z.readRawEndTag() { z.raw.end += len("</script>") goto scriptDataEscaped } if z.err != nil { return } goto scriptDataDoubleEscaped } // readComment reads the next comment token starting with "<!--". The opening // "<!--" has already been consumed. func (z *Tokenizer) readComment() { z.data.start = z.raw.end defer func() { if z.data.end < z.data.start { // It's a comment with no data, like <!-->. z.data.end = z.data.start } }() for dashCount := 2; ; { c := z.readByte() if z.err != nil { // Ignore up to two dashes at EOF. if dashCount > 2 { dashCount = 2 } z.data.end = z.raw.end - dashCount return } switch c { case '-': dashCount++ continue case '>': if dashCount >= 2 { z.data.end = z.raw.end - len("-->") return } case '!': if dashCount >= 2 { c = z.readByte() if z.err != nil { z.data.end = z.raw.end return } if c == '>' { z.data.end = z.raw.end - len("--!>") return } } } dashCount = 0 } } // readUntilCloseAngle reads until the next ">". func (z *Tokenizer) readUntilCloseAngle() { z.data.start = z.raw.end for { c := z.readByte() if z.err != nil { z.data.end = z.raw.end return } if c == '>' { z.data.end = z.raw.end - len(">") return } } } // readMarkupDeclaration reads the next token starting with "<!". It might be // a "<!--comment-->", a "<!DOCTYPE foo>", a "<![CDATA[section]]>" or // "<!a bogus comment". The opening "<!" has already been consumed. func (z *Tokenizer) readMarkupDeclaration() TokenType { z.data.start = z.raw.end var c [2]byte for i := 0; i < 2; i++ { c[i] = z.readByte() if z.err != nil { z.data.end = z.raw.end return CommentToken } } if c[0] == '-' && c[1] == '-' { z.readComment() return CommentToken } z.raw.end -= 2 if z.readDoctype() { return DoctypeToken } if z.allowCDATA && z.readCDATA() { z.convertNUL = true return TextToken } // It's a bogus comment. z.readUntilCloseAngle() return CommentToken } // readDoctype attempts to read a doctype declaration and returns true if // successful. The opening "<!" has already been consumed. func (z *Tokenizer) readDoctype() bool { const s = "DOCTYPE" for i := 0; i < len(s); i++ { c := z.readByte() if z.err != nil { z.data.end = z.raw.end return false } if c != s[i] && c != s[i]+('a'-'A') { // Back up to read the fragment of "DOCTYPE" again. z.raw.end = z.data.start return false } } if z.skipWhiteSpace(); z.err != nil { z.data.start = z.raw.end z.data.end = z.raw.end return true } z.readUntilCloseAngle() return true } // readCDATA attempts to read a CDATA section and returns true if // successful. The opening "<!" has already been consumed. func (z *Tokenizer) readCDATA() bool { const s = "[CDATA[" for i := 0; i < len(s); i++ { c := z.readByte() if z.err != nil { z.data.end = z.raw.end return false } if c != s[i] { // Back up to read the fragment of "[CDATA[" again. z.raw.end = z.data.start return false } } z.data.start = z.raw.end brackets := 0 for { c := z.readByte() if z.err != nil { z.data.end = z.raw.end return true } switch c { case ']': brackets++ case '>': if brackets >= 2 { z.data.end = z.raw.end - len("]]>") return true } brackets = 0 default: brackets = 0 } } panic("unreachable") } // startTagIn returns whether the start tag in z.buf[z.data.start:z.data.end] // case-insensitively matches any element of ss. func (z *Tokenizer) startTagIn(ss ...string) bool { loop: for _, s := range ss { if z.data.end-z.data.start != len(s) { continue loop } for i := 0; i < len(s); i++ { c := z.buf[z.data.start+i] if 'A' <= c && c <= 'Z' { c += 'a' - 'A' } if c != s[i] { continue loop } } return true } return false } // readStartTag reads the next start tag token. The opening "<a" has already // been consumed, where 'a' means anything in [A-Za-z]. func (z *Tokenizer) readStartTag() TokenType { z.readTag(true) if z.err != nil { return ErrorToken } // Several tags flag the tokenizer's next token as raw. c, raw := z.buf[z.data.start], false if 'A' <= c && c <= 'Z' { c += 'a' - 'A' } switch c { case 'i': raw = z.startTagIn("iframe") case 'n': raw = z.startTagIn("noembed", "noframes", "noscript") case 'p': raw = z.startTagIn("plaintext") case 's': raw = z.startTagIn("script", "style") case 't': raw = z.startTagIn("textarea", "title") case 'x': raw = z.startTagIn("xmp") } if raw { z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end])) } // Look for a self-closing token like "<br/>". if z.err == nil && z.buf[z.raw.end-2] == '/' { return SelfClosingTagToken } return StartTagToken } // readTag reads the next tag token and its attributes. If saveAttr, those // attributes are saved in z.attr, otherwise z.attr is set to an empty slice. // The opening "<a" or "</a" has already been consumed, where 'a' means anything // in [A-Za-z]. func (z *Tokenizer) readTag(saveAttr bool) { z.attr = z.attr[:0] z.nAttrReturned = 0 // Read the tag name and attribute key/value pairs. z.readTagName() if z.skipWhiteSpace(); z.err != nil { return } for { c := z.readByte() if z.err != nil || c == '>' { break } z.raw.end-- z.readTagAttrKey() z.readTagAttrVal() // Save pendingAttr if saveAttr and that attribute has a non-empty key. if saveAttr && z.pendingAttr[0].start != z.pendingAttr[0].end { z.attr = append(z.attr, z.pendingAttr) } if z.skipWhiteSpace(); z.err != nil { break } } } // readTagName sets z.data to the "div" in "<div k=v>". The reader (z.raw.end) // is positioned such that the first byte of the tag name (the "d" in "<div") // has already been consumed. func (z *Tokenizer) readTagName() { z.data.start = z.raw.end - 1 for { c := z.readByte() if z.err != nil { z.data.end = z.raw.end return } switch c { case ' ', '\n', '\r', '\t', '\f': z.data.end = z.raw.end - 1 return case '/', '>': z.raw.end-- z.data.end = z.raw.end return } } } // readTagAttrKey sets z.pendingAttr[0] to the "k" in "<div k=v>". // Precondition: z.err == nil. func (z *Tokenizer) readTagAttrKey() { z.pendingAttr[0].start = z.raw.end for { c := z.readByte() if z.err != nil { z.pendingAttr[0].end = z.raw.end return } switch c { case ' ', '\n', '\r', '\t', '\f', '/': z.pendingAttr[0].end = z.raw.end - 1 return case '=', '>': z.raw.end-- z.pendingAttr[0].end = z.raw.end return } } } // readTagAttrVal sets z.pendingAttr[1] to the "v" in "<div k=v>". func (z *Tokenizer) readTagAttrVal() { z.pendingAttr[1].start = z.raw.end z.pendingAttr[1].end = z.raw.end if z.skipWhiteSpace(); z.err != nil { return } c := z.readByte() if z.err != nil { return } if c != '=' { z.raw.end-- return } if z.skipWhiteSpace(); z.err != nil { return } quote := z.readByte() if z.err != nil { return } switch quote { case '>': z.raw.end-- return case '\'', '"': z.pendingAttr[1].start = z.raw.end for { c := z.readByte() if z.err != nil { z.pendingAttr[1].end = z.raw.end return } if c == quote { z.pendingAttr[1].end = z.raw.end - 1 return } } default: z.pendingAttr[1].start = z.raw.end - 1 for { c := z.readByte() if z.err != nil { z.pendingAttr[1].end = z.raw.end return } switch c { case ' ', '\n', '\r', '\t', '\f': z.pendingAttr[1].end = z.raw.end - 1 return case '>': z.raw.end-- z.pendingAttr[1].end = z.raw.end return } } } } // Next scans the next token and returns its type. func (z *Tokenizer) Next() TokenType { if z.err != nil { z.tt = ErrorToken return z.tt } z.raw.start = z.raw.end z.data.start = z.raw.end z.data.end = z.raw.end if z.rawTag != "" { if z.rawTag == "plaintext" { // Read everything up to EOF. for z.err == nil { z.readByte() } z.data.end = z.raw.end z.textIsRaw = true } else { z.readRawOrRCDATA() } if z.data.end > z.data.start { z.tt = TextToken z.convertNUL = true return z.tt } } z.textIsRaw = false z.convertNUL = false loop: for { c := z.readByte() if z.err != nil { break loop } if c != '<' { continue loop } // Check if the '<' we have just read is part of a tag, comment // or doctype. If not, it's part of the accumulated text token. c = z.readByte() if z.err != nil { break loop } var tokenType TokenType switch { case 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z': tokenType = StartTagToken case c == '/': tokenType = EndTagToken case c == '!' || c == '?': // We use CommentToken to mean any of "<!--actual comments-->", // "<!DOCTYPE declarations>" and "<?xml processing instructions?>". tokenType = CommentToken default: continue } // We have a non-text token, but we might have accumulated some text // before that. If so, we return the text first, and return the non- // text token on the subsequent call to Next. if x := z.raw.end - len("<a"); z.raw.start < x { z.raw.end = x z.data.end = x z.tt = TextToken return z.tt } switch tokenType { case StartTagToken: z.tt = z.readStartTag() return z.tt case EndTagToken: c = z.readByte() if z.err != nil { break loop } if c == '>' { // "</>" does not generate a token at all. // Reset the tokenizer state and start again. z.raw.start = z.raw.end z.data.start = z.raw.end z.data.end = z.raw.end continue loop } if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' { z.readTag(false) if z.err != nil { z.tt = ErrorToken } else { z.tt = EndTagToken } return z.tt } z.raw.end-- z.readUntilCloseAngle() z.tt = CommentToken return z.tt case CommentToken: if c == '!' { z.tt = z.readMarkupDeclaration() return z.tt } z.raw.end-- z.readUntilCloseAngle() z.tt = CommentToken return z.tt } } if z.raw.start < z.raw.end { z.data.end = z.raw.end z.tt = TextToken return z.tt } z.tt = ErrorToken return z.tt } // Raw returns the unmodified text of the current token. Calling Next, Token, // Text, TagName or TagAttr may change the contents of the returned slice. func (z *Tokenizer) Raw() []byte { return z.buf[z.raw.start:z.raw.end] } // convertNewlines converts "\r" and "\r\n" in s to "\n". // The conversion happens in place, but the resulting slice may be shorter. func convertNewlines(s []byte) []byte { for i, c := range s { if c != '\r' { continue } src := i + 1 if src >= len(s) || s[src] != '\n' { s[i] = '\n' continue } dst := i for src < len(s) { if s[src] == '\r' { if src+1 < len(s) && s[src+1] == '\n' { src++ } s[dst] = '\n' } else { s[dst] = s[src] } src++ dst++ } return s[:dst] } return s } var ( nul = []byte("\x00") replacement = []byte("\ufffd") ) // Text returns the unescaped text of a text, comment or doctype token. The // contents of the returned slice may change on the next call to Next. func (z *Tokenizer) Text() []byte { switch z.tt { case TextToken, CommentToken, DoctypeToken: s := z.buf[z.data.start:z.data.end] z.data.start = z.raw.end z.data.end = z.raw.end s = convertNewlines(s) if (z.convertNUL || z.tt == CommentToken) && bytes.Contains(s, nul) { s = bytes.Replace(s, nul, replacement, -1) } if !z.textIsRaw { s = unescape(s, false) } return s } return nil } // TagName returns the lower-cased name of a tag token (the `img` out of // `<IMG SRC="foo">`) and whether the tag has attributes. // The contents of the returned slice may change on the next call to Next. func (z *Tokenizer) TagName() (name []byte, hasAttr bool) { if z.data.start < z.data.end { switch z.tt { case StartTagToken, EndTagToken, SelfClosingTagToken: s := z.buf[z.data.start:z.data.end] z.data.start = z.raw.end z.data.end = z.raw.end return lower(s), z.nAttrReturned < len(z.attr) } } return nil, false } // TagAttr returns the lower-cased key and unescaped value of the next unparsed // attribute for the current tag token and whether there are more attributes. // The contents of the returned slices may change on the next call to Next. func (z *Tokenizer) TagAttr() (key, val []byte, moreAttr bool) { if z.nAttrReturned < len(z.attr) { switch z.tt { case StartTagToken, SelfClosingTagToken: x := z.attr[z.nAttrReturned] z.nAttrReturned++ key = z.buf[x[0].start:x[0].end] val = z.buf[x[1].start:x[1].end] return lower(key), unescape(convertNewlines(val), true), z.nAttrReturned < len(z.attr) } } return nil, nil, false } // Token returns the next Token. The result's Data and Attr values remain valid // after subsequent Next calls. func (z *Tokenizer) Token() Token { t := Token{Type: z.tt} switch z.tt { case TextToken, CommentToken, DoctypeToken: t.Data = string(z.Text()) case StartTagToken, SelfClosingTagToken, EndTagToken: name, moreAttr := z.TagName() for moreAttr { var key, val []byte key, val, moreAttr = z.TagAttr() t.Attr = append(t.Attr, Attribute{"", atom.String(key), string(val)}) } if a := atom.Lookup(name); a != 0 { t.DataAtom, t.Data = a, a.String() } else { t.DataAtom, t.Data = 0, string(name) } } return t } // NewTokenizer returns a new HTML Tokenizer for the given Reader. // The input is assumed to be UTF-8 encoded. func NewTokenizer(r io.Reader) *Tokenizer { return NewTokenizerFragment(r, "") } // NewTokenizerFragment returns a new HTML Tokenizer for the given Reader, for // tokenizing an exisitng element's InnerHTML fragment. contextTag is that // element's tag, such as "div" or "iframe". // // For example, how the InnerHTML "a<b" is tokenized depends on whether it is // for a <p> tag or a <script> tag. // // The input is assumed to be UTF-8 encoded. func NewTokenizerFragment(r io.Reader, contextTag string) *Tokenizer { z := &Tokenizer{ r: r, buf: make([]byte, 0, 4096), } if contextTag != "" { switch s := strings.ToLower(contextTag); s { case "iframe", "noembed", "noframes", "noscript", "plaintext", "script", "style", "title", "textarea", "xmp": z.rawTag = s } } return z } �������������������������������������������������������������������������������������������������������������������������������������go.net/html/parse.go��������������������������������������������������������������������������������0000644�0001751�0001751�00000137755�12235217213�013751� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package html import ( "errors" "fmt" "io" "strings" a "code.google.com/p/go.net/html/atom" ) // A parser implements the HTML5 parsing algorithm: // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#tree-construction type parser struct { // tokenizer provides the tokens for the parser. tokenizer *Tokenizer // tok is the most recently read token. tok Token // Self-closing tags like <hr/> are treated as start tags, except that // hasSelfClosingToken is set while they are being processed. hasSelfClosingToken bool // doc is the document root element. doc *Node // The stack of open elements (section 12.2.3.2) and active formatting // elements (section 12.2.3.3). oe, afe nodeStack // Element pointers (section 12.2.3.4). head, form *Node // Other parsing state flags (section 12.2.3.5). scripting, framesetOK bool // im is the current insertion mode. im insertionMode // originalIM is the insertion mode to go back to after completing a text // or inTableText insertion mode. originalIM insertionMode // fosterParenting is whether new elements should be inserted according to // the foster parenting rules (section 12.2.5.3). fosterParenting bool // quirks is whether the parser is operating in "quirks mode." quirks bool // fragment is whether the parser is parsing an HTML fragment. fragment bool // context is the context element when parsing an HTML fragment // (section 12.4). context *Node } func (p *parser) top() *Node { if n := p.oe.top(); n != nil { return n } return p.doc } // Stop tags for use in popUntil. These come from section 12.2.3.2. var ( defaultScopeStopTags = map[string][]a.Atom{ "": {a.Applet, a.Caption, a.Html, a.Table, a.Td, a.Th, a.Marquee, a.Object}, "math": {a.AnnotationXml, a.Mi, a.Mn, a.Mo, a.Ms, a.Mtext}, "svg": {a.Desc, a.ForeignObject, a.Title}, } ) type scope int const ( defaultScope scope = iota listItemScope buttonScope tableScope tableRowScope tableBodyScope selectScope ) // popUntil pops the stack of open elements at the highest element whose tag // is in matchTags, provided there is no higher element in the scope's stop // tags (as defined in section 12.2.3.2). It returns whether or not there was // such an element. If there was not, popUntil leaves the stack unchanged. // // For example, the set of stop tags for table scope is: "html", "table". If // the stack was: // ["html", "body", "font", "table", "b", "i", "u"] // then popUntil(tableScope, "font") would return false, but // popUntil(tableScope, "i") would return true and the stack would become: // ["html", "body", "font", "table", "b"] // // If an element's tag is in both the stop tags and matchTags, then the stack // will be popped and the function returns true (provided, of course, there was // no higher element in the stack that was also in the stop tags). For example, // popUntil(tableScope, "table") returns true and leaves: // ["html", "body", "font"] func (p *parser) popUntil(s scope, matchTags ...a.Atom) bool { if i := p.indexOfElementInScope(s, matchTags...); i != -1 { p.oe = p.oe[:i] return true } return false } // indexOfElementInScope returns the index in p.oe of the highest element whose // tag is in matchTags that is in scope. If no matching element is in scope, it // returns -1. func (p *parser) indexOfElementInScope(s scope, matchTags ...a.Atom) int { for i := len(p.oe) - 1; i >= 0; i-- { tagAtom := p.oe[i].DataAtom if p.oe[i].Namespace == "" { for _, t := range matchTags { if t == tagAtom { return i } } switch s { case defaultScope: // No-op. case listItemScope: if tagAtom == a.Ol || tagAtom == a.Ul { return -1 } case buttonScope: if tagAtom == a.Button { return -1 } case tableScope: if tagAtom == a.Html || tagAtom == a.Table { return -1 } case selectScope: if tagAtom != a.Optgroup && tagAtom != a.Option { return -1 } default: panic("unreachable") } } switch s { case defaultScope, listItemScope, buttonScope: for _, t := range defaultScopeStopTags[p.oe[i].Namespace] { if t == tagAtom { return -1 } } } } return -1 } // elementInScope is like popUntil, except that it doesn't modify the stack of // open elements. func (p *parser) elementInScope(s scope, matchTags ...a.Atom) bool { return p.indexOfElementInScope(s, matchTags...) != -1 } // clearStackToContext pops elements off the stack of open elements until a // scope-defined element is found. func (p *parser) clearStackToContext(s scope) { for i := len(p.oe) - 1; i >= 0; i-- { tagAtom := p.oe[i].DataAtom switch s { case tableScope: if tagAtom == a.Html || tagAtom == a.Table { p.oe = p.oe[:i+1] return } case tableRowScope: if tagAtom == a.Html || tagAtom == a.Tr { p.oe = p.oe[:i+1] return } case tableBodyScope: if tagAtom == a.Html || tagAtom == a.Tbody || tagAtom == a.Tfoot || tagAtom == a.Thead { p.oe = p.oe[:i+1] return } default: panic("unreachable") } } } // generateImpliedEndTags pops nodes off the stack of open elements as long as // the top node has a tag name of dd, dt, li, option, optgroup, p, rp, or rt. // If exceptions are specified, nodes with that name will not be popped off. func (p *parser) generateImpliedEndTags(exceptions ...string) { var i int loop: for i = len(p.oe) - 1; i >= 0; i-- { n := p.oe[i] if n.Type == ElementNode { switch n.DataAtom { case a.Dd, a.Dt, a.Li, a.Option, a.Optgroup, a.P, a.Rp, a.Rt: for _, except := range exceptions { if n.Data == except { break loop } } continue } } break } p.oe = p.oe[:i+1] } // addChild adds a child node n to the top element, and pushes n onto the stack // of open elements if it is an element node. func (p *parser) addChild(n *Node) { if p.shouldFosterParent() { p.fosterParent(n) } else { p.top().AppendChild(n) } if n.Type == ElementNode { p.oe = append(p.oe, n) } } // shouldFosterParent returns whether the next node to be added should be // foster parented. func (p *parser) shouldFosterParent() bool { if p.fosterParenting { switch p.top().DataAtom { case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr: return true } } return false } // fosterParent adds a child node according to the foster parenting rules. // Section 12.2.5.3, "foster parenting". func (p *parser) fosterParent(n *Node) { var table, parent, prev *Node var i int for i = len(p.oe) - 1; i >= 0; i-- { if p.oe[i].DataAtom == a.Table { table = p.oe[i] break } } if table == nil { // The foster parent is the html element. parent = p.oe[0] } else { parent = table.Parent } if parent == nil { parent = p.oe[i-1] } if table != nil { prev = table.PrevSibling } else { prev = parent.LastChild } if prev != nil && prev.Type == TextNode && n.Type == TextNode { prev.Data += n.Data return } parent.InsertBefore(n, table) } // addText adds text to the preceding node if it is a text node, or else it // calls addChild with a new text node. func (p *parser) addText(text string) { if text == "" { return } if p.shouldFosterParent() { p.fosterParent(&Node{ Type: TextNode, Data: text, }) return } t := p.top() if n := t.LastChild; n != nil && n.Type == TextNode { n.Data += text return } p.addChild(&Node{ Type: TextNode, Data: text, }) } // addElement adds a child element based on the current token. func (p *parser) addElement() { p.addChild(&Node{ Type: ElementNode, DataAtom: p.tok.DataAtom, Data: p.tok.Data, Attr: p.tok.Attr, }) } // Section 12.2.3.3. func (p *parser) addFormattingElement() { tagAtom, attr := p.tok.DataAtom, p.tok.Attr p.addElement() // Implement the Noah's Ark clause, but with three per family instead of two. identicalElements := 0 findIdenticalElements: for i := len(p.afe) - 1; i >= 0; i-- { n := p.afe[i] if n.Type == scopeMarkerNode { break } if n.Type != ElementNode { continue } if n.Namespace != "" { continue } if n.DataAtom != tagAtom { continue } if len(n.Attr) != len(attr) { continue } compareAttributes: for _, t0 := range n.Attr { for _, t1 := range attr { if t0.Key == t1.Key && t0.Namespace == t1.Namespace && t0.Val == t1.Val { // Found a match for this attribute, continue with the next attribute. continue compareAttributes } } // If we get here, there is no attribute that matches a. // Therefore the element is not identical to the new one. continue findIdenticalElements } identicalElements++ if identicalElements >= 3 { p.afe.remove(n) } } p.afe = append(p.afe, p.top()) } // Section 12.2.3.3. func (p *parser) clearActiveFormattingElements() { for { n := p.afe.pop() if len(p.afe) == 0 || n.Type == scopeMarkerNode { return } } } // Section 12.2.3.3. func (p *parser) reconstructActiveFormattingElements() { n := p.afe.top() if n == nil { return } if n.Type == scopeMarkerNode || p.oe.index(n) != -1 { return } i := len(p.afe) - 1 for n.Type != scopeMarkerNode && p.oe.index(n) == -1 { if i == 0 { i = -1 break } i-- n = p.afe[i] } for { i++ clone := p.afe[i].clone() p.addChild(clone) p.afe[i] = clone if i == len(p.afe)-1 { break } } } // Section 12.2.4. func (p *parser) acknowledgeSelfClosingTag() { p.hasSelfClosingToken = false } // An insertion mode (section 12.2.3.1) is the state transition function from // a particular state in the HTML5 parser's state machine. It updates the // parser's fields depending on parser.tok (where ErrorToken means EOF). // It returns whether the token was consumed. type insertionMode func(*parser) bool // setOriginalIM sets the insertion mode to return to after completing a text or // inTableText insertion mode. // Section 12.2.3.1, "using the rules for". func (p *parser) setOriginalIM() { if p.originalIM != nil { panic("html: bad parser state: originalIM was set twice") } p.originalIM = p.im } // Section 12.2.3.1, "reset the insertion mode". func (p *parser) resetInsertionMode() { for i := len(p.oe) - 1; i >= 0; i-- { n := p.oe[i] if i == 0 && p.context != nil { n = p.context } switch n.DataAtom { case a.Select: p.im = inSelectIM case a.Td, a.Th: p.im = inCellIM case a.Tr: p.im = inRowIM case a.Tbody, a.Thead, a.Tfoot: p.im = inTableBodyIM case a.Caption: p.im = inCaptionIM case a.Colgroup: p.im = inColumnGroupIM case a.Table: p.im = inTableIM case a.Head: p.im = inBodyIM case a.Body: p.im = inBodyIM case a.Frameset: p.im = inFramesetIM case a.Html: p.im = beforeHeadIM default: continue } return } p.im = inBodyIM } const whitespace = " \t\r\n\f" // Section 12.2.5.4.1. func initialIM(p *parser) bool { switch p.tok.Type { case TextToken: p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) if len(p.tok.Data) == 0 { // It was all whitespace, so ignore it. return true } case CommentToken: p.doc.AppendChild(&Node{ Type: CommentNode, Data: p.tok.Data, }) return true case DoctypeToken: n, quirks := parseDoctype(p.tok.Data) p.doc.AppendChild(n) p.quirks = quirks p.im = beforeHTMLIM return true } p.quirks = true p.im = beforeHTMLIM return false } // Section 12.2.5.4.2. func beforeHTMLIM(p *parser) bool { switch p.tok.Type { case DoctypeToken: // Ignore the token. return true case TextToken: p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) if len(p.tok.Data) == 0 { // It was all whitespace, so ignore it. return true } case StartTagToken: if p.tok.DataAtom == a.Html { p.addElement() p.im = beforeHeadIM return true } case EndTagToken: switch p.tok.DataAtom { case a.Head, a.Body, a.Html, a.Br: p.parseImpliedToken(StartTagToken, a.Html, a.Html.String()) return false default: // Ignore the token. return true } case CommentToken: p.doc.AppendChild(&Node{ Type: CommentNode, Data: p.tok.Data, }) return true } p.parseImpliedToken(StartTagToken, a.Html, a.Html.String()) return false } // Section 12.2.5.4.3. func beforeHeadIM(p *parser) bool { switch p.tok.Type { case TextToken: p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) if len(p.tok.Data) == 0 { // It was all whitespace, so ignore it. return true } case StartTagToken: switch p.tok.DataAtom { case a.Head: p.addElement() p.head = p.top() p.im = inHeadIM return true case a.Html: return inBodyIM(p) } case EndTagToken: switch p.tok.DataAtom { case a.Head, a.Body, a.Html, a.Br: p.parseImpliedToken(StartTagToken, a.Head, a.Head.String()) return false default: // Ignore the token. return true } case CommentToken: p.addChild(&Node{ Type: CommentNode, Data: p.tok.Data, }) return true case DoctypeToken: // Ignore the token. return true } p.parseImpliedToken(StartTagToken, a.Head, a.Head.String()) return false } // Section 12.2.5.4.4. func inHeadIM(p *parser) bool { switch p.tok.Type { case TextToken: s := strings.TrimLeft(p.tok.Data, whitespace) if len(s) < len(p.tok.Data) { // Add the initial whitespace to the current node. p.addText(p.tok.Data[:len(p.tok.Data)-len(s)]) if s == "" { return true } p.tok.Data = s } case StartTagToken: switch p.tok.DataAtom { case a.Html: return inBodyIM(p) case a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta: p.addElement() p.oe.pop() p.acknowledgeSelfClosingTag() return true case a.Script, a.Title, a.Noscript, a.Noframes, a.Style: p.addElement() p.setOriginalIM() p.im = textIM return true case a.Head: // Ignore the token. return true } case EndTagToken: switch p.tok.DataAtom { case a.Head: n := p.oe.pop() if n.DataAtom != a.Head { panic("html: bad parser state: <head> element not found, in the in-head insertion mode") } p.im = afterHeadIM return true case a.Body, a.Html, a.Br: p.parseImpliedToken(EndTagToken, a.Head, a.Head.String()) return false default: // Ignore the token. return true } case CommentToken: p.addChild(&Node{ Type: CommentNode, Data: p.tok.Data, }) return true case DoctypeToken: // Ignore the token. return true } p.parseImpliedToken(EndTagToken, a.Head, a.Head.String()) return false } // Section 12.2.5.4.6. func afterHeadIM(p *parser) bool { switch p.tok.Type { case TextToken: s := strings.TrimLeft(p.tok.Data, whitespace) if len(s) < len(p.tok.Data) { // Add the initial whitespace to the current node. p.addText(p.tok.Data[:len(p.tok.Data)-len(s)]) if s == "" { return true } p.tok.Data = s } case StartTagToken: switch p.tok.DataAtom { case a.Html: return inBodyIM(p) case a.Body: p.addElement() p.framesetOK = false p.im = inBodyIM return true case a.Frameset: p.addElement() p.im = inFramesetIM return true case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Title: p.oe = append(p.oe, p.head) defer p.oe.remove(p.head) return inHeadIM(p) case a.Head: // Ignore the token. return true } case EndTagToken: switch p.tok.DataAtom { case a.Body, a.Html, a.Br: // Drop down to creating an implied <body> tag. default: // Ignore the token. return true } case CommentToken: p.addChild(&Node{ Type: CommentNode, Data: p.tok.Data, }) return true case DoctypeToken: // Ignore the token. return true } p.parseImpliedToken(StartTagToken, a.Body, a.Body.String()) p.framesetOK = true return false } // copyAttributes copies attributes of src not found on dst to dst. func copyAttributes(dst *Node, src Token) { if len(src.Attr) == 0 { return } attr := map[string]string{} for _, t := range dst.Attr { attr[t.Key] = t.Val } for _, t := range src.Attr { if _, ok := attr[t.Key]; !ok { dst.Attr = append(dst.Attr, t) attr[t.Key] = t.Val } } } // Section 12.2.5.4.7. func inBodyIM(p *parser) bool { switch p.tok.Type { case TextToken: d := p.tok.Data switch n := p.oe.top(); n.DataAtom { case a.Pre, a.Listing: if n.FirstChild == nil { // Ignore a newline at the start of a <pre> block. if d != "" && d[0] == '\r' { d = d[1:] } if d != "" && d[0] == '\n' { d = d[1:] } } } d = strings.Replace(d, "\x00", "", -1) if d == "" { return true } p.reconstructActiveFormattingElements() p.addText(d) if p.framesetOK && strings.TrimLeft(d, whitespace) != "" { // There were non-whitespace characters inserted. p.framesetOK = false } case StartTagToken: switch p.tok.DataAtom { case a.Html: copyAttributes(p.oe[0], p.tok) case a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Title: return inHeadIM(p) case a.Body: if len(p.oe) >= 2 { body := p.oe[1] if body.Type == ElementNode && body.DataAtom == a.Body { p.framesetOK = false copyAttributes(body, p.tok) } } case a.Frameset: if !p.framesetOK || len(p.oe) < 2 || p.oe[1].DataAtom != a.Body { // Ignore the token. return true } body := p.oe[1] if body.Parent != nil { body.Parent.RemoveChild(body) } p.oe = p.oe[:1] p.addElement() p.im = inFramesetIM return true case a.Address, a.Article, a.Aside, a.Blockquote, a.Center, a.Details, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Menu, a.Nav, a.Ol, a.P, a.Section, a.Summary, a.Ul: p.popUntil(buttonScope, a.P) p.addElement() case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6: p.popUntil(buttonScope, a.P) switch n := p.top(); n.DataAtom { case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6: p.oe.pop() } p.addElement() case a.Pre, a.Listing: p.popUntil(buttonScope, a.P) p.addElement() // The newline, if any, will be dealt with by the TextToken case. p.framesetOK = false case a.Form: if p.form == nil { p.popUntil(buttonScope, a.P) p.addElement() p.form = p.top() } case a.Li: p.framesetOK = false for i := len(p.oe) - 1; i >= 0; i-- { node := p.oe[i] switch node.DataAtom { case a.Li: p.oe = p.oe[:i] case a.Address, a.Div, a.P: continue default: if !isSpecialElement(node) { continue } } break } p.popUntil(buttonScope, a.P) p.addElement() case a.Dd, a.Dt: p.framesetOK = false for i := len(p.oe) - 1; i >= 0; i-- { node := p.oe[i] switch node.DataAtom { case a.Dd, a.Dt: p.oe = p.oe[:i] case a.Address, a.Div, a.P: continue default: if !isSpecialElement(node) { continue } } break } p.popUntil(buttonScope, a.P) p.addElement() case a.Plaintext: p.popUntil(buttonScope, a.P) p.addElement() case a.Button: p.popUntil(defaultScope, a.Button) p.reconstructActiveFormattingElements() p.addElement() p.framesetOK = false case a.A: for i := len(p.afe) - 1; i >= 0 && p.afe[i].Type != scopeMarkerNode; i-- { if n := p.afe[i]; n.Type == ElementNode && n.DataAtom == a.A { p.inBodyEndTagFormatting(a.A) p.oe.remove(n) p.afe.remove(n) break } } p.reconstructActiveFormattingElements() p.addFormattingElement() case a.B, a.Big, a.Code, a.Em, a.Font, a.I, a.S, a.Small, a.Strike, a.Strong, a.Tt, a.U: p.reconstructActiveFormattingElements() p.addFormattingElement() case a.Nobr: p.reconstructActiveFormattingElements() if p.elementInScope(defaultScope, a.Nobr) { p.inBodyEndTagFormatting(a.Nobr) p.reconstructActiveFormattingElements() } p.addFormattingElement() case a.Applet, a.Marquee, a.Object: p.reconstructActiveFormattingElements() p.addElement() p.afe = append(p.afe, &scopeMarker) p.framesetOK = false case a.Table: if !p.quirks { p.popUntil(buttonScope, a.P) } p.addElement() p.framesetOK = false p.im = inTableIM return true case a.Area, a.Br, a.Embed, a.Img, a.Input, a.Keygen, a.Wbr: p.reconstructActiveFormattingElements() p.addElement() p.oe.pop() p.acknowledgeSelfClosingTag() if p.tok.DataAtom == a.Input { for _, t := range p.tok.Attr { if t.Key == "type" { if strings.ToLower(t.Val) == "hidden" { // Skip setting framesetOK = false return true } } } } p.framesetOK = false case a.Param, a.Source, a.Track: p.addElement() p.oe.pop() p.acknowledgeSelfClosingTag() case a.Hr: p.popUntil(buttonScope, a.P) p.addElement() p.oe.pop() p.acknowledgeSelfClosingTag() p.framesetOK = false case a.Image: p.tok.DataAtom = a.Img p.tok.Data = a.Img.String() return false case a.Isindex: if p.form != nil { // Ignore the token. return true } action := "" prompt := "This is a searchable index. Enter search keywords: " attr := []Attribute{{Key: "name", Val: "isindex"}} for _, t := range p.tok.Attr { switch t.Key { case "action": action = t.Val case "name": // Ignore the attribute. case "prompt": prompt = t.Val default: attr = append(attr, t) } } p.acknowledgeSelfClosingTag() p.popUntil(buttonScope, a.P) p.parseImpliedToken(StartTagToken, a.Form, a.Form.String()) if action != "" { p.form.Attr = []Attribute{{Key: "action", Val: action}} } p.parseImpliedToken(StartTagToken, a.Hr, a.Hr.String()) p.parseImpliedToken(StartTagToken, a.Label, a.Label.String()) p.addText(prompt) p.addChild(&Node{ Type: ElementNode, DataAtom: a.Input, Data: a.Input.String(), Attr: attr, }) p.oe.pop() p.parseImpliedToken(EndTagToken, a.Label, a.Label.String()) p.parseImpliedToken(StartTagToken, a.Hr, a.Hr.String()) p.parseImpliedToken(EndTagToken, a.Form, a.Form.String()) case a.Textarea: p.addElement() p.setOriginalIM() p.framesetOK = false p.im = textIM case a.Xmp: p.popUntil(buttonScope, a.P) p.reconstructActiveFormattingElements() p.framesetOK = false p.addElement() p.setOriginalIM() p.im = textIM case a.Iframe: p.framesetOK = false p.addElement() p.setOriginalIM() p.im = textIM case a.Noembed, a.Noscript: p.addElement() p.setOriginalIM() p.im = textIM case a.Select: p.reconstructActiveFormattingElements() p.addElement() p.framesetOK = false p.im = inSelectIM return true case a.Optgroup, a.Option: if p.top().DataAtom == a.Option { p.oe.pop() } p.reconstructActiveFormattingElements() p.addElement() case a.Rp, a.Rt: if p.elementInScope(defaultScope, a.Ruby) { p.generateImpliedEndTags() } p.addElement() case a.Math, a.Svg: p.reconstructActiveFormattingElements() if p.tok.DataAtom == a.Math { adjustAttributeNames(p.tok.Attr, mathMLAttributeAdjustments) } else { adjustAttributeNames(p.tok.Attr, svgAttributeAdjustments) } adjustForeignAttributes(p.tok.Attr) p.addElement() p.top().Namespace = p.tok.Data if p.hasSelfClosingToken { p.oe.pop() p.acknowledgeSelfClosingTag() } return true case a.Caption, a.Col, a.Colgroup, a.Frame, a.Head, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr: // Ignore the token. default: p.reconstructActiveFormattingElements() p.addElement() } case EndTagToken: switch p.tok.DataAtom { case a.Body: if p.elementInScope(defaultScope, a.Body) { p.im = afterBodyIM } case a.Html: if p.elementInScope(defaultScope, a.Body) { p.parseImpliedToken(EndTagToken, a.Body, a.Body.String()) return false } return true case a.Address, a.Article, a.Aside, a.Blockquote, a.Button, a.Center, a.Details, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Listing, a.Menu, a.Nav, a.Ol, a.Pre, a.Section, a.Summary, a.Ul: p.popUntil(defaultScope, p.tok.DataAtom) case a.Form: node := p.form p.form = nil i := p.indexOfElementInScope(defaultScope, a.Form) if node == nil || i == -1 || p.oe[i] != node { // Ignore the token. return true } p.generateImpliedEndTags() p.oe.remove(node) case a.P: if !p.elementInScope(buttonScope, a.P) { p.parseImpliedToken(StartTagToken, a.P, a.P.String()) } p.popUntil(buttonScope, a.P) case a.Li: p.popUntil(listItemScope, a.Li) case a.Dd, a.Dt: p.popUntil(defaultScope, p.tok.DataAtom) case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6: p.popUntil(defaultScope, a.H1, a.H2, a.H3, a.H4, a.H5, a.H6) case a.A, a.B, a.Big, a.Code, a.Em, a.Font, a.I, a.Nobr, a.S, a.Small, a.Strike, a.Strong, a.Tt, a.U: p.inBodyEndTagFormatting(p.tok.DataAtom) case a.Applet, a.Marquee, a.Object: if p.popUntil(defaultScope, p.tok.DataAtom) { p.clearActiveFormattingElements() } case a.Br: p.tok.Type = StartTagToken return false default: p.inBodyEndTagOther(p.tok.DataAtom) } case CommentToken: p.addChild(&Node{ Type: CommentNode, Data: p.tok.Data, }) } return true } func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) { // This is the "adoption agency" algorithm, described at // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#adoptionAgency // TODO: this is a fairly literal line-by-line translation of that algorithm. // Once the code successfully parses the comprehensive test suite, we should // refactor this code to be more idiomatic. // Steps 1-3. The outer loop. for i := 0; i < 8; i++ { // Step 4. Find the formatting element. var formattingElement *Node for j := len(p.afe) - 1; j >= 0; j-- { if p.afe[j].Type == scopeMarkerNode { break } if p.afe[j].DataAtom == tagAtom { formattingElement = p.afe[j] break } } if formattingElement == nil { p.inBodyEndTagOther(tagAtom) return } feIndex := p.oe.index(formattingElement) if feIndex == -1 { p.afe.remove(formattingElement) return } if !p.elementInScope(defaultScope, tagAtom) { // Ignore the tag. return } // Steps 5-6. Find the furthest block. var furthestBlock *Node for _, e := range p.oe[feIndex:] { if isSpecialElement(e) { furthestBlock = e break } } if furthestBlock == nil { e := p.oe.pop() for e != formattingElement { e = p.oe.pop() } p.afe.remove(e) return } // Steps 7-8. Find the common ancestor and bookmark node. commonAncestor := p.oe[feIndex-1] bookmark := p.afe.index(formattingElement) // Step 9. The inner loop. Find the lastNode to reparent. lastNode := furthestBlock node := furthestBlock x := p.oe.index(node) // Steps 9.1-9.3. for j := 0; j < 3; j++ { // Step 9.4. x-- node = p.oe[x] // Step 9.5. if p.afe.index(node) == -1 { p.oe.remove(node) continue } // Step 9.6. if node == formattingElement { break } // Step 9.7. clone := node.clone() p.afe[p.afe.index(node)] = clone p.oe[p.oe.index(node)] = clone node = clone // Step 9.8. if lastNode == furthestBlock { bookmark = p.afe.index(node) + 1 } // Step 9.9. if lastNode.Parent != nil { lastNode.Parent.RemoveChild(lastNode) } node.AppendChild(lastNode) // Step 9.10. lastNode = node } // Step 10. Reparent lastNode to the common ancestor, // or for misnested table nodes, to the foster parent. if lastNode.Parent != nil { lastNode.Parent.RemoveChild(lastNode) } switch commonAncestor.DataAtom { case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr: p.fosterParent(lastNode) default: commonAncestor.AppendChild(lastNode) } // Steps 11-13. Reparent nodes from the furthest block's children // to a clone of the formatting element. clone := formattingElement.clone() reparentChildren(clone, furthestBlock) furthestBlock.AppendChild(clone) // Step 14. Fix up the list of active formatting elements. if oldLoc := p.afe.index(formattingElement); oldLoc != -1 && oldLoc < bookmark { // Move the bookmark with the rest of the list. bookmark-- } p.afe.remove(formattingElement) p.afe.insert(bookmark, clone) // Step 15. Fix up the stack of open elements. p.oe.remove(formattingElement) p.oe.insert(p.oe.index(furthestBlock)+1, clone) } } // inBodyEndTagOther performs the "any other end tag" algorithm for inBodyIM. func (p *parser) inBodyEndTagOther(tagAtom a.Atom) { for i := len(p.oe) - 1; i >= 0; i-- { if p.oe[i].DataAtom == tagAtom { p.oe = p.oe[:i] break } if isSpecialElement(p.oe[i]) { break } } } // Section 12.2.5.4.8. func textIM(p *parser) bool { switch p.tok.Type { case ErrorToken: p.oe.pop() case TextToken: d := p.tok.Data if n := p.oe.top(); n.DataAtom == a.Textarea && n.FirstChild == nil { // Ignore a newline at the start of a <textarea> block. if d != "" && d[0] == '\r' { d = d[1:] } if d != "" && d[0] == '\n' { d = d[1:] } } if d == "" { return true } p.addText(d) return true case EndTagToken: p.oe.pop() } p.im = p.originalIM p.originalIM = nil return p.tok.Type == EndTagToken } // Section 12.2.5.4.9. func inTableIM(p *parser) bool { switch p.tok.Type { case ErrorToken: // Stop parsing. return true case TextToken: p.tok.Data = strings.Replace(p.tok.Data, "\x00", "", -1) switch p.oe.top().DataAtom { case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr: if strings.Trim(p.tok.Data, whitespace) == "" { p.addText(p.tok.Data) return true } } case StartTagToken: switch p.tok.DataAtom { case a.Caption: p.clearStackToContext(tableScope) p.afe = append(p.afe, &scopeMarker) p.addElement() p.im = inCaptionIM return true case a.Colgroup: p.clearStackToContext(tableScope) p.addElement() p.im = inColumnGroupIM return true case a.Col: p.parseImpliedToken(StartTagToken, a.Colgroup, a.Colgroup.String()) return false case a.Tbody, a.Tfoot, a.Thead: p.clearStackToContext(tableScope) p.addElement() p.im = inTableBodyIM return true case a.Td, a.Th, a.Tr: p.parseImpliedToken(StartTagToken, a.Tbody, a.Tbody.String()) return false case a.Table: if p.popUntil(tableScope, a.Table) { p.resetInsertionMode() return false } // Ignore the token. return true case a.Style, a.Script: return inHeadIM(p) case a.Input: for _, t := range p.tok.Attr { if t.Key == "type" && strings.ToLower(t.Val) == "hidden" { p.addElement() p.oe.pop() return true } } // Otherwise drop down to the default action. case a.Form: if p.form != nil { // Ignore the token. return true } p.addElement() p.form = p.oe.pop() case a.Select: p.reconstructActiveFormattingElements() switch p.top().DataAtom { case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr: p.fosterParenting = true } p.addElement() p.fosterParenting = false p.framesetOK = false p.im = inSelectInTableIM return true } case EndTagToken: switch p.tok.DataAtom { case a.Table: if p.popUntil(tableScope, a.Table) { p.resetInsertionMode() return true } // Ignore the token. return true case a.Body, a.Caption, a.Col, a.Colgroup, a.Html, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr: // Ignore the token. return true } case CommentToken: p.addChild(&Node{ Type: CommentNode, Data: p.tok.Data, }) return true case DoctypeToken: // Ignore the token. return true } p.fosterParenting = true defer func() { p.fosterParenting = false }() return inBodyIM(p) } // Section 12.2.5.4.11. func inCaptionIM(p *parser) bool { switch p.tok.Type { case StartTagToken: switch p.tok.DataAtom { case a.Caption, a.Col, a.Colgroup, a.Tbody, a.Td, a.Tfoot, a.Thead, a.Tr: if p.popUntil(tableScope, a.Caption) { p.clearActiveFormattingElements() p.im = inTableIM return false } else { // Ignore the token. return true } case a.Select: p.reconstructActiveFormattingElements() p.addElement() p.framesetOK = false p.im = inSelectInTableIM return true } case EndTagToken: switch p.tok.DataAtom { case a.Caption: if p.popUntil(tableScope, a.Caption) { p.clearActiveFormattingElements() p.im = inTableIM } return true case a.Table: if p.popUntil(tableScope, a.Caption) { p.clearActiveFormattingElements() p.im = inTableIM return false } else { // Ignore the token. return true } case a.Body, a.Col, a.Colgroup, a.Html, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr: // Ignore the token. return true } } return inBodyIM(p) } // Section 12.2.5.4.12. func inColumnGroupIM(p *parser) bool { switch p.tok.Type { case TextToken: s := strings.TrimLeft(p.tok.Data, whitespace) if len(s) < len(p.tok.Data) { // Add the initial whitespace to the current node. p.addText(p.tok.Data[:len(p.tok.Data)-len(s)]) if s == "" { return true } p.tok.Data = s } case CommentToken: p.addChild(&Node{ Type: CommentNode, Data: p.tok.Data, }) return true case DoctypeToken: // Ignore the token. return true case StartTagToken: switch p.tok.DataAtom { case a.Html: return inBodyIM(p) case a.Col: p.addElement() p.oe.pop() p.acknowledgeSelfClosingTag() return true } case EndTagToken: switch p.tok.DataAtom { case a.Colgroup: if p.oe.top().DataAtom != a.Html { p.oe.pop() p.im = inTableIM } return true case a.Col: // Ignore the token. return true } } if p.oe.top().DataAtom != a.Html { p.oe.pop() p.im = inTableIM return false } return true } // Section 12.2.5.4.13. func inTableBodyIM(p *parser) bool { switch p.tok.Type { case StartTagToken: switch p.tok.DataAtom { case a.Tr: p.clearStackToContext(tableBodyScope) p.addElement() p.im = inRowIM return true case a.Td, a.Th: p.parseImpliedToken(StartTagToken, a.Tr, a.Tr.String()) return false case a.Caption, a.Col, a.Colgroup, a.Tbody, a.Tfoot, a.Thead: if p.popUntil(tableScope, a.Tbody, a.Thead, a.Tfoot) { p.im = inTableIM return false } // Ignore the token. return true } case EndTagToken: switch p.tok.DataAtom { case a.Tbody, a.Tfoot, a.Thead: if p.elementInScope(tableScope, p.tok.DataAtom) { p.clearStackToContext(tableBodyScope) p.oe.pop() p.im = inTableIM } return true case a.Table: if p.popUntil(tableScope, a.Tbody, a.Thead, a.Tfoot) { p.im = inTableIM return false } // Ignore the token. return true case a.Body, a.Caption, a.Col, a.Colgroup, a.Html, a.Td, a.Th, a.Tr: // Ignore the token. return true } case CommentToken: p.addChild(&Node{ Type: CommentNode, Data: p.tok.Data, }) return true } return inTableIM(p) } // Section 12.2.5.4.14. func inRowIM(p *parser) bool { switch p.tok.Type { case StartTagToken: switch p.tok.DataAtom { case a.Td, a.Th: p.clearStackToContext(tableRowScope) p.addElement() p.afe = append(p.afe, &scopeMarker) p.im = inCellIM return true case a.Caption, a.Col, a.Colgroup, a.Tbody, a.Tfoot, a.Thead, a.Tr: if p.popUntil(tableScope, a.Tr) { p.im = inTableBodyIM return false } // Ignore the token. return true } case EndTagToken: switch p.tok.DataAtom { case a.Tr: if p.popUntil(tableScope, a.Tr) { p.im = inTableBodyIM return true } // Ignore the token. return true case a.Table: if p.popUntil(tableScope, a.Tr) { p.im = inTableBodyIM return false } // Ignore the token. return true case a.Tbody, a.Tfoot, a.Thead: if p.elementInScope(tableScope, p.tok.DataAtom) { p.parseImpliedToken(EndTagToken, a.Tr, a.Tr.String()) return false } // Ignore the token. return true case a.Body, a.Caption, a.Col, a.Colgroup, a.Html, a.Td, a.Th: // Ignore the token. return true } } return inTableIM(p) } // Section 12.2.5.4.15. func inCellIM(p *parser) bool { switch p.tok.Type { case StartTagToken: switch p.tok.DataAtom { case a.Caption, a.Col, a.Colgroup, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr: if p.popUntil(tableScope, a.Td, a.Th) { // Close the cell and reprocess. p.clearActiveFormattingElements() p.im = inRowIM return false } // Ignore the token. return true case a.Select: p.reconstructActiveFormattingElements() p.addElement() p.framesetOK = false p.im = inSelectInTableIM return true } case EndTagToken: switch p.tok.DataAtom { case a.Td, a.Th: if !p.popUntil(tableScope, p.tok.DataAtom) { // Ignore the token. return true } p.clearActiveFormattingElements() p.im = inRowIM return true case a.Body, a.Caption, a.Col, a.Colgroup, a.Html: // Ignore the token. return true case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr: if !p.elementInScope(tableScope, p.tok.DataAtom) { // Ignore the token. return true } // Close the cell and reprocess. p.popUntil(tableScope, a.Td, a.Th) p.clearActiveFormattingElements() p.im = inRowIM return false } } return inBodyIM(p) } // Section 12.2.5.4.16. func inSelectIM(p *parser) bool { switch p.tok.Type { case ErrorToken: // Stop parsing. return true case TextToken: p.addText(strings.Replace(p.tok.Data, "\x00", "", -1)) case StartTagToken: switch p.tok.DataAtom { case a.Html: return inBodyIM(p) case a.Option: if p.top().DataAtom == a.Option { p.oe.pop() } p.addElement() case a.Optgroup: if p.top().DataAtom == a.Option { p.oe.pop() } if p.top().DataAtom == a.Optgroup { p.oe.pop() } p.addElement() case a.Select: p.tok.Type = EndTagToken return false case a.Input, a.Keygen, a.Textarea: if p.elementInScope(selectScope, a.Select) { p.parseImpliedToken(EndTagToken, a.Select, a.Select.String()) return false } // In order to properly ignore <textarea>, we need to change the tokenizer mode. p.tokenizer.NextIsNotRawText() // Ignore the token. return true case a.Script: return inHeadIM(p) } case EndTagToken: switch p.tok.DataAtom { case a.Option: if p.top().DataAtom == a.Option { p.oe.pop() } case a.Optgroup: i := len(p.oe) - 1 if p.oe[i].DataAtom == a.Option { i-- } if p.oe[i].DataAtom == a.Optgroup { p.oe = p.oe[:i] } case a.Select: if p.popUntil(selectScope, a.Select) { p.resetInsertionMode() } } case CommentToken: p.doc.AppendChild(&Node{ Type: CommentNode, Data: p.tok.Data, }) case DoctypeToken: // Ignore the token. return true } return true } // Section 12.2.5.4.17. func inSelectInTableIM(p *parser) bool { switch p.tok.Type { case StartTagToken, EndTagToken: switch p.tok.DataAtom { case a.Caption, a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr, a.Td, a.Th: if p.tok.Type == StartTagToken || p.elementInScope(tableScope, p.tok.DataAtom) { p.parseImpliedToken(EndTagToken, a.Select, a.Select.String()) return false } else { // Ignore the token. return true } } } return inSelectIM(p) } // Section 12.2.5.4.18. func afterBodyIM(p *parser) bool { switch p.tok.Type { case ErrorToken: // Stop parsing. return true case TextToken: s := strings.TrimLeft(p.tok.Data, whitespace) if len(s) == 0 { // It was all whitespace. return inBodyIM(p) } case StartTagToken: if p.tok.DataAtom == a.Html { return inBodyIM(p) } case EndTagToken: if p.tok.DataAtom == a.Html { if !p.fragment { p.im = afterAfterBodyIM } return true } case CommentToken: // The comment is attached to the <html> element. if len(p.oe) < 1 || p.oe[0].DataAtom != a.Html { panic("html: bad parser state: <html> element not found, in the after-body insertion mode") } p.oe[0].AppendChild(&Node{ Type: CommentNode, Data: p.tok.Data, }) return true } p.im = inBodyIM return false } // Section 12.2.5.4.19. func inFramesetIM(p *parser) bool { switch p.tok.Type { case CommentToken: p.addChild(&Node{ Type: CommentNode, Data: p.tok.Data, }) case TextToken: // Ignore all text but whitespace. s := strings.Map(func(c rune) rune { switch c { case ' ', '\t', '\n', '\f', '\r': return c } return -1 }, p.tok.Data) if s != "" { p.addText(s) } case StartTagToken: switch p.tok.DataAtom { case a.Html: return inBodyIM(p) case a.Frameset: p.addElement() case a.Frame: p.addElement() p.oe.pop() p.acknowledgeSelfClosingTag() case a.Noframes: return inHeadIM(p) } case EndTagToken: switch p.tok.DataAtom { case a.Frameset: if p.oe.top().DataAtom != a.Html { p.oe.pop() if p.oe.top().DataAtom != a.Frameset { p.im = afterFramesetIM return true } } } default: // Ignore the token. } return true } // Section 12.2.5.4.20. func afterFramesetIM(p *parser) bool { switch p.tok.Type { case CommentToken: p.addChild(&Node{ Type: CommentNode, Data: p.tok.Data, }) case TextToken: // Ignore all text but whitespace. s := strings.Map(func(c rune) rune { switch c { case ' ', '\t', '\n', '\f', '\r': return c } return -1 }, p.tok.Data) if s != "" { p.addText(s) } case StartTagToken: switch p.tok.DataAtom { case a.Html: return inBodyIM(p) case a.Noframes: return inHeadIM(p) } case EndTagToken: switch p.tok.DataAtom { case a.Html: p.im = afterAfterFramesetIM return true } default: // Ignore the token. } return true } // Section 12.2.5.4.21. func afterAfterBodyIM(p *parser) bool { switch p.tok.Type { case ErrorToken: // Stop parsing. return true case TextToken: s := strings.TrimLeft(p.tok.Data, whitespace) if len(s) == 0 { // It was all whitespace. return inBodyIM(p) } case StartTagToken: if p.tok.DataAtom == a.Html { return inBodyIM(p) } case CommentToken: p.doc.AppendChild(&Node{ Type: CommentNode, Data: p.tok.Data, }) return true case DoctypeToken: return inBodyIM(p) } p.im = inBodyIM return false } // Section 12.2.5.4.22. func afterAfterFramesetIM(p *parser) bool { switch p.tok.Type { case CommentToken: p.doc.AppendChild(&Node{ Type: CommentNode, Data: p.tok.Data, }) case TextToken: // Ignore all text but whitespace. s := strings.Map(func(c rune) rune { switch c { case ' ', '\t', '\n', '\f', '\r': return c } return -1 }, p.tok.Data) if s != "" { p.tok.Data = s return inBodyIM(p) } case StartTagToken: switch p.tok.DataAtom { case a.Html: return inBodyIM(p) case a.Noframes: return inHeadIM(p) } case DoctypeToken: return inBodyIM(p) default: // Ignore the token. } return true } const whitespaceOrNUL = whitespace + "\x00" // Section 12.2.5.5. func parseForeignContent(p *parser) bool { switch p.tok.Type { case TextToken: if p.framesetOK { p.framesetOK = strings.TrimLeft(p.tok.Data, whitespaceOrNUL) == "" } p.tok.Data = strings.Replace(p.tok.Data, "\x00", "\ufffd", -1) p.addText(p.tok.Data) case CommentToken: p.addChild(&Node{ Type: CommentNode, Data: p.tok.Data, }) case StartTagToken: b := breakout[p.tok.Data] if p.tok.DataAtom == a.Font { loop: for _, attr := range p.tok.Attr { switch attr.Key { case "color", "face", "size": b = true break loop } } } if b { for i := len(p.oe) - 1; i >= 0; i-- { n := p.oe[i] if n.Namespace == "" || htmlIntegrationPoint(n) || mathMLTextIntegrationPoint(n) { p.oe = p.oe[:i+1] break } } return false } switch p.top().Namespace { case "math": adjustAttributeNames(p.tok.Attr, mathMLAttributeAdjustments) case "svg": // Adjust SVG tag names. The tokenizer lower-cases tag names, but // SVG wants e.g. "foreignObject" with a capital second "O". if x := svgTagNameAdjustments[p.tok.Data]; x != "" { p.tok.DataAtom = a.Lookup([]byte(x)) p.tok.Data = x } adjustAttributeNames(p.tok.Attr, svgAttributeAdjustments) default: panic("html: bad parser state: unexpected namespace") } adjustForeignAttributes(p.tok.Attr) namespace := p.top().Namespace p.addElement() p.top().Namespace = namespace if namespace != "" { // Don't let the tokenizer go into raw text mode in foreign content // (e.g. in an SVG <title> tag). p.tokenizer.NextIsNotRawText() } if p.hasSelfClosingToken { p.oe.pop() p.acknowledgeSelfClosingTag() } case EndTagToken: for i := len(p.oe) - 1; i >= 0; i-- { if p.oe[i].Namespace == "" { return p.im(p) } if strings.EqualFold(p.oe[i].Data, p.tok.Data) { p.oe = p.oe[:i] break } } return true default: // Ignore the token. } return true } // Section 12.2.5. func (p *parser) inForeignContent() bool { if len(p.oe) == 0 { return false } n := p.oe[len(p.oe)-1] if n.Namespace == "" { return false } if mathMLTextIntegrationPoint(n) { if p.tok.Type == StartTagToken && p.tok.DataAtom != a.Mglyph && p.tok.DataAtom != a.Malignmark { return false } if p.tok.Type == TextToken { return false } } if n.Namespace == "math" && n.DataAtom == a.AnnotationXml && p.tok.Type == StartTagToken && p.tok.DataAtom == a.Svg { return false } if htmlIntegrationPoint(n) && (p.tok.Type == StartTagToken || p.tok.Type == TextToken) { return false } if p.tok.Type == ErrorToken { return false } return true } // parseImpliedToken parses a token as though it had appeared in the parser's // input. func (p *parser) parseImpliedToken(t TokenType, dataAtom a.Atom, data string) { realToken, selfClosing := p.tok, p.hasSelfClosingToken p.tok = Token{ Type: t, DataAtom: dataAtom, Data: data, } p.hasSelfClosingToken = false p.parseCurrentToken() p.tok, p.hasSelfClosingToken = realToken, selfClosing } // parseCurrentToken runs the current token through the parsing routines // until it is consumed. func (p *parser) parseCurrentToken() { if p.tok.Type == SelfClosingTagToken { p.hasSelfClosingToken = true p.tok.Type = StartTagToken } consumed := false for !consumed { if p.inForeignContent() { consumed = parseForeignContent(p) } else { consumed = p.im(p) } } if p.hasSelfClosingToken { // This is a parse error, but ignore it. p.hasSelfClosingToken = false } } func (p *parser) parse() error { // Iterate until EOF. Any other error will cause an early return. var err error for err != io.EOF { // CDATA sections are allowed only in foreign content. n := p.oe.top() p.tokenizer.AllowCDATA(n != nil && n.Namespace != "") // Read and parse the next token. p.tokenizer.Next() p.tok = p.tokenizer.Token() if p.tok.Type == ErrorToken { err = p.tokenizer.Err() if err != nil && err != io.EOF { return err } } p.parseCurrentToken() } return nil } // Parse returns the parse tree for the HTML from the given Reader. // The input is assumed to be UTF-8 encoded. func Parse(r io.Reader) (*Node, error) { p := &parser{ tokenizer: NewTokenizer(r), doc: &Node{ Type: DocumentNode, }, scripting: true, framesetOK: true, im: initialIM, } err := p.parse() if err != nil { return nil, err } return p.doc, nil } // ParseFragment parses a fragment of HTML and returns the nodes that were // found. If the fragment is the InnerHTML for an existing element, pass that // element in context. func ParseFragment(r io.Reader, context *Node) ([]*Node, error) { contextTag := "" if context != nil { if context.Type != ElementNode { return nil, errors.New("html: ParseFragment of non-element Node") } // The next check isn't just context.DataAtom.String() == context.Data because // it is valid to pass an element whose tag isn't a known atom. For example, // DataAtom == 0 and Data = "tagfromthefuture" is perfectly consistent. if context.DataAtom != a.Lookup([]byte(context.Data)) { return nil, fmt.Errorf("html: inconsistent Node: DataAtom=%q, Data=%q", context.DataAtom, context.Data) } contextTag = context.DataAtom.String() } p := &parser{ tokenizer: NewTokenizerFragment(r, contextTag), doc: &Node{ Type: DocumentNode, }, scripting: true, fragment: true, context: context, } root := &Node{ Type: ElementNode, DataAtom: a.Html, Data: a.Html.String(), } p.doc.AppendChild(root) p.oe = nodeStack{root} p.resetInsertionMode() for n := context; n != nil; n = n.Parent { if n.Type == ElementNode && n.DataAtom == a.Form { p.form = n break } } err := p.parse() if err != nil { return nil, err } parent := p.doc if context != nil { parent = root } var result []*Node for c := parent.FirstChild; c != nil; { next := c.NextSibling parent.RemoveChild(c) result = append(result, c) c = next } return result, nil } �������������������go.net/html/atom/�����������������������������������������������������������������������������������0000755�0001751�0001751�00000000000�12235217213�013226� 5����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/atom/table.go���������������������������������������������������������������������������0000644�0001751�0001751�00000052011�12235217213�014643� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// generated by go run gen.go; DO NOT EDIT package atom const ( A Atom = 0x1 Abbr Atom = 0x4 Accept Atom = 0x2106 AcceptCharset Atom = 0x210e Accesskey Atom = 0x3309 Action Atom = 0x21b06 Address Atom = 0x5d507 Align Atom = 0x1105 Alt Atom = 0x4503 Annotation Atom = 0x18d0a AnnotationXml Atom = 0x18d0e Applet Atom = 0x2d106 Area Atom = 0x31804 Article Atom = 0x39907 Aside Atom = 0x4f05 Async Atom = 0x9305 Audio Atom = 0xaf05 Autocomplete Atom = 0xd50c Autofocus Atom = 0xe109 Autoplay Atom = 0x10c08 B Atom = 0x101 Base Atom = 0x11404 Basefont Atom = 0x11408 Bdi Atom = 0x1a03 Bdo Atom = 0x12503 Bgsound Atom = 0x13807 Big Atom = 0x14403 Blink Atom = 0x14705 Blockquote Atom = 0x14c0a Body Atom = 0x2f04 Border Atom = 0x15606 Br Atom = 0x202 Button Atom = 0x15c06 Canvas Atom = 0x4b06 Caption Atom = 0x1e007 Center Atom = 0x2df06 Challenge Atom = 0x23e09 Charset Atom = 0x2807 Checked Atom = 0x33f07 Cite Atom = 0x9704 Class Atom = 0x3d905 Code Atom = 0x16f04 Col Atom = 0x17603 Colgroup Atom = 0x17608 Color Atom = 0x18305 Cols Atom = 0x18804 Colspan Atom = 0x18807 Command Atom = 0x19b07 Content Atom = 0x42c07 Contenteditable Atom = 0x42c0f Contextmenu Atom = 0x3480b Controls Atom = 0x1ae08 Coords Atom = 0x1ba06 Crossorigin Atom = 0x1c40b Data Atom = 0x44304 Datalist Atom = 0x44308 Datetime Atom = 0x25b08 Dd Atom = 0x28802 Default Atom = 0x5207 Defer Atom = 0x17105 Del Atom = 0x4d603 Desc Atom = 0x4804 Details Atom = 0x6507 Dfn Atom = 0x8303 Dialog Atom = 0x1b06 Dir Atom = 0x9d03 Dirname Atom = 0x9d07 Disabled Atom = 0x10008 Div Atom = 0x10703 Dl Atom = 0x13e02 Download Atom = 0x40908 Draggable Atom = 0x1a109 Dropzone Atom = 0x3a208 Dt Atom = 0x4e402 Em Atom = 0x7f02 Embed Atom = 0x7f05 Enctype Atom = 0x23007 Face Atom = 0x2dd04 Fieldset Atom = 0x1d508 Figcaption Atom = 0x1dd0a Figure Atom = 0x1f106 Font Atom = 0x11804 Footer Atom = 0x5906 For Atom = 0x1fd03 ForeignObject Atom = 0x1fd0d Foreignobject Atom = 0x20a0d Form Atom = 0x21704 Formaction Atom = 0x2170a Formenctype Atom = 0x22c0b Formmethod Atom = 0x2470a Formnovalidate Atom = 0x2510e Formtarget Atom = 0x2660a Frame Atom = 0x8705 Frameset Atom = 0x8708 H1 Atom = 0x13602 H2 Atom = 0x29602 H3 Atom = 0x2c502 H4 Atom = 0x30e02 H5 Atom = 0x4e602 H6 Atom = 0x27002 Head Atom = 0x2fa04 Header Atom = 0x2fa06 Headers Atom = 0x2fa07 Height Atom = 0x27206 Hgroup Atom = 0x27a06 Hidden Atom = 0x28606 High Atom = 0x29304 Hr Atom = 0x13102 Href Atom = 0x29804 Hreflang Atom = 0x29808 Html Atom = 0x27604 HttpEquiv Atom = 0x2a00a I Atom = 0x601 Icon Atom = 0x42b04 Id Atom = 0x5102 Iframe Atom = 0x2b406 Image Atom = 0x2ba05 Img Atom = 0x2bf03 Inert Atom = 0x4c105 Input Atom = 0x3f605 Ins Atom = 0x1cd03 Isindex Atom = 0x2c707 Ismap Atom = 0x2ce05 Itemid Atom = 0x9806 Itemprop Atom = 0x57e08 Itemref Atom = 0x2d707 Itemscope Atom = 0x2e509 Itemtype Atom = 0x2ef08 Kbd Atom = 0x1903 Keygen Atom = 0x3906 Keytype Atom = 0x51207 Kind Atom = 0xfd04 Label Atom = 0xba05 Lang Atom = 0x29c04 Legend Atom = 0x1a806 Li Atom = 0x1202 Link Atom = 0x14804 List Atom = 0x44704 Listing Atom = 0x44707 Loop Atom = 0xbe04 Low Atom = 0x13f03 Malignmark Atom = 0x100a Manifest Atom = 0x5b608 Map Atom = 0x2d003 Mark Atom = 0x1604 Marquee Atom = 0x5f207 Math Atom = 0x2f704 Max Atom = 0x30603 Maxlength Atom = 0x30609 Media Atom = 0xa205 Mediagroup Atom = 0xa20a Menu Atom = 0x34f04 Meta Atom = 0x45604 Meter Atom = 0x26105 Method Atom = 0x24b06 Mglyph Atom = 0x2c006 Mi Atom = 0x9b02 Min Atom = 0x31003 Mn Atom = 0x25402 Mo Atom = 0x47a02 Ms Atom = 0x2e802 Mtext Atom = 0x31305 Multiple Atom = 0x32108 Muted Atom = 0x32905 Name Atom = 0xa004 Nav Atom = 0x3e03 Nobr Atom = 0x7404 Noembed Atom = 0x7d07 Noframes Atom = 0x8508 Noscript Atom = 0x28b08 Novalidate Atom = 0x2550a Object Atom = 0x21106 Ol Atom = 0xcd02 Onabort Atom = 0x16007 Onafterprint Atom = 0x1e50c Onbeforeprint Atom = 0x21f0d Onbeforeunload Atom = 0x5c90e Onblur Atom = 0x3e206 Oncancel Atom = 0xb308 Oncanplay Atom = 0x12709 Oncanplaythrough Atom = 0x12710 Onchange Atom = 0x3b808 Onclick Atom = 0x2ad07 Onclose Atom = 0x32e07 Oncontextmenu Atom = 0x3460d Oncuechange Atom = 0x3530b Ondblclick Atom = 0x35e0a Ondrag Atom = 0x36806 Ondragend Atom = 0x36809 Ondragenter Atom = 0x3710b Ondragleave Atom = 0x37c0b Ondragover Atom = 0x3870a Ondragstart Atom = 0x3910b Ondrop Atom = 0x3a006 Ondurationchange Atom = 0x3b010 Onemptied Atom = 0x3a709 Onended Atom = 0x3c007 Onerror Atom = 0x3c707 Onfocus Atom = 0x3ce07 Onhashchange Atom = 0x3e80c Oninput Atom = 0x3f407 Oninvalid Atom = 0x3fb09 Onkeydown Atom = 0x40409 Onkeypress Atom = 0x4110a Onkeyup Atom = 0x42107 Onload Atom = 0x43b06 Onloadeddata Atom = 0x43b0c Onloadedmetadata Atom = 0x44e10 Onloadstart Atom = 0x4640b Onmessage Atom = 0x46f09 Onmousedown Atom = 0x4780b Onmousemove Atom = 0x4830b Onmouseout Atom = 0x48e0a Onmouseover Atom = 0x49b0b Onmouseup Atom = 0x4a609 Onmousewheel Atom = 0x4af0c Onoffline Atom = 0x4bb09 Ononline Atom = 0x4c608 Onpagehide Atom = 0x4ce0a Onpageshow Atom = 0x4d90a Onpause Atom = 0x4e807 Onplay Atom = 0x4f206 Onplaying Atom = 0x4f209 Onpopstate Atom = 0x4fb0a Onprogress Atom = 0x5050a Onratechange Atom = 0x5190c Onreset Atom = 0x52507 Onresize Atom = 0x52c08 Onscroll Atom = 0x53a08 Onseeked Atom = 0x54208 Onseeking Atom = 0x54a09 Onselect Atom = 0x55308 Onshow Atom = 0x55d06 Onstalled Atom = 0x56609 Onstorage Atom = 0x56f09 Onsubmit Atom = 0x57808 Onsuspend Atom = 0x58809 Ontimeupdate Atom = 0x1190c Onunload Atom = 0x59108 Onvolumechange Atom = 0x5990e Onwaiting Atom = 0x5a709 Open Atom = 0x58404 Optgroup Atom = 0xc008 Optimum Atom = 0x5b007 Option Atom = 0x5c506 Output Atom = 0x49506 P Atom = 0xc01 Param Atom = 0xc05 Pattern Atom = 0x6e07 Ping Atom = 0xab04 Placeholder Atom = 0xc70b Plaintext Atom = 0xf109 Poster Atom = 0x17d06 Pre Atom = 0x27f03 Preload Atom = 0x27f07 Progress Atom = 0x50708 Prompt Atom = 0x5bf06 Public Atom = 0x42706 Q Atom = 0x15101 Radiogroup Atom = 0x30a Readonly Atom = 0x31908 Rel Atom = 0x28003 Required Atom = 0x1f508 Reversed Atom = 0x5e08 Rows Atom = 0x7704 Rowspan Atom = 0x7707 Rp Atom = 0x1eb02 Rt Atom = 0x16502 Ruby Atom = 0xd104 S Atom = 0x2c01 Samp Atom = 0x6b04 Sandbox Atom = 0xe907 Scope Atom = 0x2e905 Scoped Atom = 0x2e906 Script Atom = 0x28d06 Seamless Atom = 0x33308 Section Atom = 0x3dd07 Select Atom = 0x55506 Selected Atom = 0x55508 Shape Atom = 0x1b505 Size Atom = 0x53004 Sizes Atom = 0x53005 Small Atom = 0x1bf05 Source Atom = 0x1cf06 Spacer Atom = 0x30006 Span Atom = 0x7a04 Spellcheck Atom = 0x33a0a Src Atom = 0x3d403 Srcdoc Atom = 0x3d406 Srclang Atom = 0x41a07 Start Atom = 0x39705 Step Atom = 0x5bc04 Strike Atom = 0x50e06 Strong Atom = 0x53406 Style Atom = 0x5db05 Sub Atom = 0x57a03 Summary Atom = 0x5e007 Sup Atom = 0x5e703 Svg Atom = 0x5ea03 System Atom = 0x5ed06 Tabindex Atom = 0x45c08 Table Atom = 0x43605 Target Atom = 0x26a06 Tbody Atom = 0x2e05 Td Atom = 0x4702 Textarea Atom = 0x31408 Tfoot Atom = 0x5805 Th Atom = 0x13002 Thead Atom = 0x2f905 Time Atom = 0x11b04 Title Atom = 0x8e05 Tr Atom = 0xf902 Track Atom = 0xf905 Translate Atom = 0x16609 Tt Atom = 0x7002 Type Atom = 0x23304 Typemustmatch Atom = 0x2330d U Atom = 0xb01 Ul Atom = 0x5602 Usemap Atom = 0x4ec06 Value Atom = 0x4005 Var Atom = 0x10903 Video Atom = 0x2a905 Wbr Atom = 0x14103 Width Atom = 0x4e205 Wrap Atom = 0x56204 Xmp Atom = 0xef03 ) const hash0 = 0xc17da63e const maxAtomLen = 16 var table = [1 << 9]Atom{ 0x1: 0x4830b, // onmousemove 0x2: 0x5a709, // onwaiting 0x4: 0x5bf06, // prompt 0x7: 0x5b007, // optimum 0x8: 0x1604, // mark 0xa: 0x2d707, // itemref 0xb: 0x4d90a, // onpageshow 0xc: 0x55506, // select 0xd: 0x1a109, // draggable 0xe: 0x3e03, // nav 0xf: 0x19b07, // command 0x11: 0xb01, // u 0x14: 0x2fa07, // headers 0x15: 0x44308, // datalist 0x17: 0x6b04, // samp 0x1a: 0x40409, // onkeydown 0x1b: 0x53a08, // onscroll 0x1c: 0x17603, // col 0x20: 0x57e08, // itemprop 0x21: 0x2a00a, // http-equiv 0x22: 0x5e703, // sup 0x24: 0x1f508, // required 0x2b: 0x27f07, // preload 0x2c: 0x21f0d, // onbeforeprint 0x2d: 0x3710b, // ondragenter 0x2e: 0x4e402, // dt 0x2f: 0x57808, // onsubmit 0x30: 0x13102, // hr 0x31: 0x3460d, // oncontextmenu 0x33: 0x2ba05, // image 0x34: 0x4e807, // onpause 0x35: 0x27a06, // hgroup 0x36: 0xab04, // ping 0x37: 0x55308, // onselect 0x3a: 0x10703, // div 0x40: 0x9b02, // mi 0x41: 0x33308, // seamless 0x42: 0x2807, // charset 0x43: 0x5102, // id 0x44: 0x4fb0a, // onpopstate 0x45: 0x4d603, // del 0x46: 0x5f207, // marquee 0x47: 0x3309, // accesskey 0x49: 0x5906, // footer 0x4a: 0x2d106, // applet 0x4b: 0x2ce05, // ismap 0x51: 0x34f04, // menu 0x52: 0x2f04, // body 0x55: 0x8708, // frameset 0x56: 0x52507, // onreset 0x57: 0x14705, // blink 0x58: 0x8e05, // title 0x59: 0x39907, // article 0x5b: 0x13002, // th 0x5d: 0x15101, // q 0x5e: 0x58404, // open 0x5f: 0x31804, // area 0x61: 0x43b06, // onload 0x62: 0x3f605, // input 0x63: 0x11404, // base 0x64: 0x18807, // colspan 0x65: 0x51207, // keytype 0x66: 0x13e02, // dl 0x68: 0x1d508, // fieldset 0x6a: 0x31003, // min 0x6b: 0x10903, // var 0x6f: 0x2fa06, // header 0x70: 0x16502, // rt 0x71: 0x17608, // colgroup 0x72: 0x25402, // mn 0x74: 0x16007, // onabort 0x75: 0x3906, // keygen 0x76: 0x4bb09, // onoffline 0x77: 0x23e09, // challenge 0x78: 0x2d003, // map 0x7a: 0x30e02, // h4 0x7b: 0x3c707, // onerror 0x7c: 0x30609, // maxlength 0x7d: 0x31305, // mtext 0x7e: 0x5805, // tfoot 0x7f: 0x11804, // font 0x80: 0x100a, // malignmark 0x81: 0x45604, // meta 0x82: 0x9305, // async 0x83: 0x2c502, // h3 0x84: 0x28802, // dd 0x85: 0x29804, // href 0x86: 0xa20a, // mediagroup 0x87: 0x1ba06, // coords 0x88: 0x41a07, // srclang 0x89: 0x35e0a, // ondblclick 0x8a: 0x4005, // value 0x8c: 0xb308, // oncancel 0x8e: 0x33a0a, // spellcheck 0x8f: 0x8705, // frame 0x91: 0x14403, // big 0x94: 0x21b06, // action 0x95: 0x9d03, // dir 0x97: 0x31908, // readonly 0x99: 0x43605, // table 0x9a: 0x5e007, // summary 0x9b: 0x14103, // wbr 0x9c: 0x30a, // radiogroup 0x9d: 0xa004, // name 0x9f: 0x5ed06, // system 0xa1: 0x18305, // color 0xa2: 0x4b06, // canvas 0xa3: 0x27604, // html 0xa5: 0x54a09, // onseeking 0xac: 0x1b505, // shape 0xad: 0x28003, // rel 0xae: 0x12710, // oncanplaythrough 0xaf: 0x3870a, // ondragover 0xb1: 0x1fd0d, // foreignObject 0xb3: 0x7704, // rows 0xb6: 0x44707, // listing 0xb7: 0x49506, // output 0xb9: 0x3480b, // contextmenu 0xbb: 0x13f03, // low 0xbc: 0x1eb02, // rp 0xbd: 0x58809, // onsuspend 0xbe: 0x15c06, // button 0xbf: 0x4804, // desc 0xc1: 0x3dd07, // section 0xc2: 0x5050a, // onprogress 0xc3: 0x56f09, // onstorage 0xc4: 0x2f704, // math 0xc5: 0x4f206, // onplay 0xc7: 0x5602, // ul 0xc8: 0x6e07, // pattern 0xc9: 0x4af0c, // onmousewheel 0xca: 0x36809, // ondragend 0xcb: 0xd104, // ruby 0xcc: 0xc01, // p 0xcd: 0x32e07, // onclose 0xce: 0x26105, // meter 0xcf: 0x13807, // bgsound 0xd2: 0x27206, // height 0xd4: 0x101, // b 0xd5: 0x2ef08, // itemtype 0xd8: 0x1e007, // caption 0xd9: 0x10008, // disabled 0xdc: 0x5ea03, // svg 0xdd: 0x1bf05, // small 0xde: 0x44304, // data 0xe0: 0x4c608, // ononline 0xe1: 0x2c006, // mglyph 0xe3: 0x7f05, // embed 0xe4: 0xf902, // tr 0xe5: 0x4640b, // onloadstart 0xe7: 0x3b010, // ondurationchange 0xed: 0x12503, // bdo 0xee: 0x4702, // td 0xef: 0x4f05, // aside 0xf0: 0x29602, // h2 0xf1: 0x50708, // progress 0xf2: 0x14c0a, // blockquote 0xf4: 0xba05, // label 0xf5: 0x601, // i 0xf7: 0x7707, // rowspan 0xfb: 0x4f209, // onplaying 0xfd: 0x2bf03, // img 0xfe: 0xc008, // optgroup 0xff: 0x42c07, // content 0x101: 0x5190c, // onratechange 0x103: 0x3e80c, // onhashchange 0x104: 0x6507, // details 0x106: 0x40908, // download 0x109: 0xe907, // sandbox 0x10b: 0x42c0f, // contenteditable 0x10d: 0x37c0b, // ondragleave 0x10e: 0x2106, // accept 0x10f: 0x55508, // selected 0x112: 0x2170a, // formaction 0x113: 0x2df06, // center 0x115: 0x44e10, // onloadedmetadata 0x116: 0x14804, // link 0x117: 0x11b04, // time 0x118: 0x1c40b, // crossorigin 0x119: 0x3ce07, // onfocus 0x11a: 0x56204, // wrap 0x11b: 0x42b04, // icon 0x11d: 0x2a905, // video 0x11e: 0x3d905, // class 0x121: 0x5990e, // onvolumechange 0x122: 0x3e206, // onblur 0x123: 0x2e509, // itemscope 0x124: 0x5db05, // style 0x127: 0x42706, // public 0x129: 0x2510e, // formnovalidate 0x12a: 0x55d06, // onshow 0x12c: 0x16609, // translate 0x12d: 0x9704, // cite 0x12e: 0x2e802, // ms 0x12f: 0x1190c, // ontimeupdate 0x130: 0xfd04, // kind 0x131: 0x2660a, // formtarget 0x135: 0x3c007, // onended 0x136: 0x28606, // hidden 0x137: 0x2c01, // s 0x139: 0x2470a, // formmethod 0x13a: 0x44704, // list 0x13c: 0x27002, // h6 0x13d: 0xcd02, // ol 0x13e: 0x3530b, // oncuechange 0x13f: 0x20a0d, // foreignobject 0x143: 0x5c90e, // onbeforeunload 0x145: 0x3a709, // onemptied 0x146: 0x17105, // defer 0x147: 0xef03, // xmp 0x148: 0xaf05, // audio 0x149: 0x1903, // kbd 0x14c: 0x46f09, // onmessage 0x14d: 0x5c506, // option 0x14e: 0x4503, // alt 0x14f: 0x33f07, // checked 0x150: 0x10c08, // autoplay 0x152: 0x202, // br 0x153: 0x2550a, // novalidate 0x156: 0x7d07, // noembed 0x159: 0x2ad07, // onclick 0x15a: 0x4780b, // onmousedown 0x15b: 0x3b808, // onchange 0x15e: 0x3fb09, // oninvalid 0x15f: 0x2e906, // scoped 0x160: 0x1ae08, // controls 0x161: 0x32905, // muted 0x163: 0x4ec06, // usemap 0x164: 0x1dd0a, // figcaption 0x165: 0x36806, // ondrag 0x166: 0x29304, // high 0x168: 0x3d403, // src 0x169: 0x17d06, // poster 0x16b: 0x18d0e, // annotation-xml 0x16c: 0x5bc04, // step 0x16d: 0x4, // abbr 0x16e: 0x1b06, // dialog 0x170: 0x1202, // li 0x172: 0x47a02, // mo 0x175: 0x1fd03, // for 0x176: 0x1cd03, // ins 0x178: 0x53004, // size 0x17a: 0x5207, // default 0x17b: 0x1a03, // bdi 0x17c: 0x4ce0a, // onpagehide 0x17d: 0x9d07, // dirname 0x17e: 0x23304, // type 0x17f: 0x21704, // form 0x180: 0x4c105, // inert 0x181: 0x12709, // oncanplay 0x182: 0x8303, // dfn 0x183: 0x45c08, // tabindex 0x186: 0x7f02, // em 0x187: 0x29c04, // lang 0x189: 0x3a208, // dropzone 0x18a: 0x4110a, // onkeypress 0x18b: 0x25b08, // datetime 0x18c: 0x18804, // cols 0x18d: 0x1, // a 0x18e: 0x43b0c, // onloadeddata 0x191: 0x15606, // border 0x192: 0x2e05, // tbody 0x193: 0x24b06, // method 0x195: 0xbe04, // loop 0x196: 0x2b406, // iframe 0x198: 0x2fa04, // head 0x19e: 0x5b608, // manifest 0x19f: 0xe109, // autofocus 0x1a0: 0x16f04, // code 0x1a1: 0x53406, // strong 0x1a2: 0x32108, // multiple 0x1a3: 0xc05, // param 0x1a6: 0x23007, // enctype 0x1a7: 0x2dd04, // face 0x1a8: 0xf109, // plaintext 0x1a9: 0x13602, // h1 0x1aa: 0x56609, // onstalled 0x1ad: 0x28d06, // script 0x1ae: 0x30006, // spacer 0x1af: 0x52c08, // onresize 0x1b0: 0x49b0b, // onmouseover 0x1b1: 0x59108, // onunload 0x1b2: 0x54208, // onseeked 0x1b4: 0x2330d, // typemustmatch 0x1b5: 0x1f106, // figure 0x1b6: 0x48e0a, // onmouseout 0x1b7: 0x27f03, // pre 0x1b8: 0x4e205, // width 0x1bb: 0x7404, // nobr 0x1be: 0x7002, // tt 0x1bf: 0x1105, // align 0x1c0: 0x3f407, // oninput 0x1c3: 0x42107, // onkeyup 0x1c6: 0x1e50c, // onafterprint 0x1c7: 0x210e, // accept-charset 0x1c8: 0x9806, // itemid 0x1cb: 0x50e06, // strike 0x1cc: 0x57a03, // sub 0x1cd: 0xf905, // track 0x1ce: 0x39705, // start 0x1d0: 0x11408, // basefont 0x1d6: 0x1cf06, // source 0x1d7: 0x1a806, // legend 0x1d8: 0x2f905, // thead 0x1da: 0x2e905, // scope 0x1dd: 0x21106, // object 0x1de: 0xa205, // media 0x1df: 0x18d0a, // annotation 0x1e0: 0x22c0b, // formenctype 0x1e2: 0x28b08, // noscript 0x1e4: 0x53005, // sizes 0x1e5: 0xd50c, // autocomplete 0x1e6: 0x7a04, // span 0x1e7: 0x8508, // noframes 0x1e8: 0x26a06, // target 0x1e9: 0x3a006, // ondrop 0x1ea: 0x3d406, // srcdoc 0x1ec: 0x5e08, // reversed 0x1f0: 0x2c707, // isindex 0x1f3: 0x29808, // hreflang 0x1f5: 0x4e602, // h5 0x1f6: 0x5d507, // address 0x1fa: 0x30603, // max 0x1fb: 0xc70b, // placeholder 0x1fc: 0x31408, // textarea 0x1fe: 0x4a609, // onmouseup 0x1ff: 0x3910b, // ondragstart } const atomText = "abbradiogrouparamalignmarkbdialogaccept-charsetbodyaccesskey" + "genavaluealtdescanvasidefaultfootereversedetailsampatternobr" + "owspanoembedfnoframesetitleasyncitemidirnamediagroupingaudio" + "ncancelabelooptgrouplaceholderubyautocompleteautofocusandbox" + "mplaintextrackindisabledivarautoplaybasefontimeupdatebdoncan" + "playthrough1bgsoundlowbrbigblinkblockquoteborderbuttonabortr" + "anslatecodefercolgroupostercolorcolspannotation-xmlcommandra" + "ggablegendcontrolshapecoordsmallcrossoriginsourcefieldsetfig" + "captionafterprintfigurequiredforeignObjectforeignobjectforma" + "ctionbeforeprintformenctypemustmatchallengeformmethodformnov" + "alidatetimeterformtargeth6heightmlhgroupreloadhiddenoscripth" + "igh2hreflanghttp-equivideonclickiframeimageimglyph3isindexis" + "mappletitemrefacenteritemscopeditemtypematheaderspacermaxlen" + "gth4minmtextareadonlymultiplemutedoncloseamlesspellcheckedon" + "contextmenuoncuechangeondblclickondragendondragenterondragle" + "aveondragoverondragstarticleondropzonemptiedondurationchange" + "onendedonerroronfocusrcdoclassectionbluronhashchangeoninputo" + "ninvalidonkeydownloadonkeypressrclangonkeyupublicontentedita" + "bleonloadeddatalistingonloadedmetadatabindexonloadstartonmes" + "sageonmousedownonmousemoveonmouseoutputonmouseoveronmouseupo" + "nmousewheelonofflinertononlineonpagehidelonpageshowidth5onpa" + "usemaponplayingonpopstateonprogresstrikeytypeonratechangeonr" + "esetonresizestrongonscrollonseekedonseekingonselectedonshowr" + "aponstalledonstorageonsubmitempropenonsuspendonunloadonvolum" + "echangeonwaitingoptimumanifestepromptoptionbeforeunloaddress" + "tylesummarysupsvgsystemarquee" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/atom/gen.go�����������������������������������������������������������������������������0000644�0001751�0001751�00000023733�12235217213�014336� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build ignore package main // This program generates table.go and table_test.go. // Invoke as // // go run gen.go |gofmt >table.go // go run gen.go -test |gofmt >table_test.go import ( "flag" "fmt" "math/rand" "os" "sort" "strings" ) // identifier converts s to a Go exported identifier. // It converts "div" to "Div" and "accept-charset" to "AcceptCharset". func identifier(s string) string { b := make([]byte, 0, len(s)) cap := true for _, c := range s { if c == '-' { cap = true continue } if cap && 'a' <= c && c <= 'z' { c -= 'a' - 'A' } cap = false b = append(b, byte(c)) } return string(b) } var test = flag.Bool("test", false, "generate table_test.go") func main() { flag.Parse() var all []string all = append(all, elements...) all = append(all, attributes...) all = append(all, eventHandlers...) all = append(all, extra...) sort.Strings(all) if *test { fmt.Printf("// generated by go run gen.go -test; DO NOT EDIT\n\n") fmt.Printf("package atom\n\n") fmt.Printf("var testAtomList = []string{\n") for _, s := range all { fmt.Printf("\t%q,\n", s) } fmt.Printf("}\n") return } // uniq - lists have dups // compute max len too maxLen := 0 w := 0 for _, s := range all { if w == 0 || all[w-1] != s { if maxLen < len(s) { maxLen = len(s) } all[w] = s w++ } } all = all[:w] // Find hash that minimizes table size. var best *table for i := 0; i < 1000000; i++ { if best != nil && 1<<(best.k-1) < len(all) { break } h := rand.Uint32() for k := uint(0); k <= 16; k++ { if best != nil && k >= best.k { break } var t table if t.init(h, k, all) { best = &t break } } } if best == nil { fmt.Fprintf(os.Stderr, "failed to construct string table\n") os.Exit(1) } // Lay out strings, using overlaps when possible. layout := append([]string{}, all...) // Remove strings that are substrings of other strings for changed := true; changed; { changed = false for i, s := range layout { if s == "" { continue } for j, t := range layout { if i != j && t != "" && strings.Contains(s, t) { changed = true layout[j] = "" } } } } // Join strings where one suffix matches another prefix. for { // Find best i, j, k such that layout[i][len-k:] == layout[j][:k], // maximizing overlap length k. besti := -1 bestj := -1 bestk := 0 for i, s := range layout { if s == "" { continue } for j, t := range layout { if i == j { continue } for k := bestk + 1; k <= len(s) && k <= len(t); k++ { if s[len(s)-k:] == t[:k] { besti = i bestj = j bestk = k } } } } if bestk > 0 { layout[besti] += layout[bestj][bestk:] layout[bestj] = "" continue } break } text := strings.Join(layout, "") atom := map[string]uint32{} for _, s := range all { off := strings.Index(text, s) if off < 0 { panic("lost string " + s) } atom[s] = uint32(off<<8 | len(s)) } // Generate the Go code. fmt.Printf("// generated by go run gen.go; DO NOT EDIT\n\n") fmt.Printf("package atom\n\nconst (\n") for _, s := range all { fmt.Printf("\t%s Atom = %#x\n", identifier(s), atom[s]) } fmt.Printf(")\n\n") fmt.Printf("const hash0 = %#x\n\n", best.h0) fmt.Printf("const maxAtomLen = %d\n\n", maxLen) fmt.Printf("var table = [1<<%d]Atom{\n", best.k) for i, s := range best.tab { if s == "" { continue } fmt.Printf("\t%#x: %#x, // %s\n", i, atom[s], s) } fmt.Printf("}\n") datasize := (1 << best.k) * 4 fmt.Printf("const atomText =\n") textsize := len(text) for len(text) > 60 { fmt.Printf("\t%q +\n", text[:60]) text = text[60:] } fmt.Printf("\t%q\n\n", text) fmt.Fprintf(os.Stderr, "%d atoms; %d string bytes + %d tables = %d total data\n", len(all), textsize, datasize, textsize+datasize) } type byLen []string func (x byLen) Less(i, j int) bool { return len(x[i]) > len(x[j]) } func (x byLen) Swap(i, j int) { x[i], x[j] = x[j], x[i] } func (x byLen) Len() int { return len(x) } // fnv computes the FNV hash with an arbitrary starting value h. func fnv(h uint32, s string) uint32 { for i := 0; i < len(s); i++ { h ^= uint32(s[i]) h *= 16777619 } return h } // A table represents an attempt at constructing the lookup table. // The lookup table uses cuckoo hashing, meaning that each string // can be found in one of two positions. type table struct { h0 uint32 k uint mask uint32 tab []string } // hash returns the two hashes for s. func (t *table) hash(s string) (h1, h2 uint32) { h := fnv(t.h0, s) h1 = h & t.mask h2 = (h >> 16) & t.mask return } // init initializes the table with the given parameters. // h0 is the initial hash value, // k is the number of bits of hash value to use, and // x is the list of strings to store in the table. // init returns false if the table cannot be constructed. func (t *table) init(h0 uint32, k uint, x []string) bool { t.h0 = h0 t.k = k t.tab = make([]string, 1<<k) t.mask = 1<<k - 1 for _, s := range x { if !t.insert(s) { return false } } return true } // insert inserts s in the table. func (t *table) insert(s string) bool { h1, h2 := t.hash(s) if t.tab[h1] == "" { t.tab[h1] = s return true } if t.tab[h2] == "" { t.tab[h2] = s return true } if t.push(h1, 0) { t.tab[h1] = s return true } if t.push(h2, 0) { t.tab[h2] = s return true } return false } // push attempts to push aside the entry in slot i. func (t *table) push(i uint32, depth int) bool { if depth > len(t.tab) { return false } s := t.tab[i] h1, h2 := t.hash(s) j := h1 + h2 - i if t.tab[j] != "" && !t.push(j, depth+1) { return false } t.tab[j] = s return true } // The lists of element names and attribute keys were taken from // http://www.whatwg.org/specs/web-apps/current-work/multipage/section-index.html // as of the "HTML Living Standard - Last Updated 30 May 2012" version. var elements = []string{ "a", "abbr", "address", "area", "article", "aside", "audio", "b", "base", "bdi", "bdo", "blockquote", "body", "br", "button", "canvas", "caption", "cite", "code", "col", "colgroup", "command", "data", "datalist", "dd", "del", "details", "dfn", "dialog", "div", "dl", "dt", "em", "embed", "fieldset", "figcaption", "figure", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hgroup", "hr", "html", "i", "iframe", "img", "input", "ins", "kbd", "keygen", "label", "legend", "li", "link", "map", "mark", "menu", "meta", "meter", "nav", "noscript", "object", "ol", "optgroup", "option", "output", "p", "param", "pre", "progress", "q", "rp", "rt", "ruby", "s", "samp", "script", "section", "select", "small", "source", "span", "strong", "style", "sub", "summary", "sup", "table", "tbody", "td", "textarea", "tfoot", "th", "thead", "time", "title", "tr", "track", "u", "ul", "var", "video", "wbr", } var attributes = []string{ "accept", "accept-charset", "accesskey", "action", "alt", "async", "autocomplete", "autofocus", "autoplay", "border", "challenge", "charset", "checked", "cite", "class", "cols", "colspan", "command", "content", "contenteditable", "contextmenu", "controls", "coords", "crossorigin", "data", "datetime", "default", "defer", "dir", "dirname", "disabled", "download", "draggable", "dropzone", "enctype", "for", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "headers", "height", "hidden", "high", "href", "hreflang", "http-equiv", "icon", "id", "inert", "ismap", "itemid", "itemprop", "itemref", "itemscope", "itemtype", "keytype", "kind", "label", "lang", "list", "loop", "low", "manifest", "max", "maxlength", "media", "mediagroup", "method", "min", "multiple", "muted", "name", "novalidate", "open", "optimum", "pattern", "ping", "placeholder", "poster", "preload", "radiogroup", "readonly", "rel", "required", "reversed", "rows", "rowspan", "sandbox", "spellcheck", "scope", "scoped", "seamless", "selected", "shape", "size", "sizes", "span", "src", "srcdoc", "srclang", "start", "step", "style", "tabindex", "target", "title", "translate", "type", "typemustmatch", "usemap", "value", "width", "wrap", } var eventHandlers = []string{ "onabort", "onafterprint", "onbeforeprint", "onbeforeunload", "onblur", "oncancel", "oncanplay", "oncanplaythrough", "onchange", "onclick", "onclose", "oncontextmenu", "oncuechange", "ondblclick", "ondrag", "ondragend", "ondragenter", "ondragleave", "ondragover", "ondragstart", "ondrop", "ondurationchange", "onemptied", "onended", "onerror", "onfocus", "onhashchange", "oninput", "oninvalid", "onkeydown", "onkeypress", "onkeyup", "onload", "onloadeddata", "onloadedmetadata", "onloadstart", "onmessage", "onmousedown", "onmousemove", "onmouseout", "onmouseover", "onmouseup", "onmousewheel", "onoffline", "ononline", "onpagehide", "onpageshow", "onpause", "onplay", "onplaying", "onpopstate", "onprogress", "onratechange", "onreset", "onresize", "onscroll", "onseeked", "onseeking", "onselect", "onshow", "onstalled", "onstorage", "onsubmit", "onsuspend", "ontimeupdate", "onunload", "onvolumechange", "onwaiting", } // extra are ad-hoc values not covered by any of the lists above. var extra = []string{ "align", "annotation", "annotation-xml", "applet", "basefont", "bgsound", "big", "blink", "center", "color", "desc", "face", "font", "foreignObject", // HTML is case-insensitive, but SVG-embedded-in-HTML is case-sensitive. "foreignobject", "frame", "frameset", "image", "isindex", "listing", "malignmark", "marquee", "math", "mglyph", "mi", "mn", "mo", "ms", "mtext", "nobr", "noembed", "noframes", "plaintext", "prompt", "public", "spacer", "strike", "svg", "system", "tt", "xmp", } �������������������������������������go.net/html/atom/atom_test.go�����������������������������������������������������������������������0000644�0001751�0001751�00000004162�12235217213�015557� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// 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. package atom import ( "sort" "testing" ) func TestKnown(t *testing.T) { for _, s := range testAtomList { if atom := Lookup([]byte(s)); atom.String() != s { t.Errorf("Lookup(%q) = %#x (%q)", s, uint32(atom), atom.String()) } } } func TestHits(t *testing.T) { for _, a := range table { if a == 0 { continue } got := Lookup([]byte(a.String())) if got != a { t.Errorf("Lookup(%q) = %#x, want %#x", a.String(), uint32(got), uint32(a)) } } } func TestMisses(t *testing.T) { testCases := []string{ "", "\x00", "\xff", "A", "DIV", "Div", "dIV", "aa", "a\x00", "ab", "abb", "abbr0", "abbr ", " abbr", " a", "acceptcharset", "acceptCharset", "accept_charset", "h0", "h1h2", "h7", "onClick", "λ", // The following string has the same hash (0xa1d7fab7) as "onmouseover". "\x00\x00\x00\x00\x00\x50\x18\xae\x38\xd0\xb7", } for _, tc := range testCases { got := Lookup([]byte(tc)) if got != 0 { t.Errorf("Lookup(%q): got %d, want 0", tc, got) } } } func TestForeignObject(t *testing.T) { const ( afo = Foreignobject afO = ForeignObject sfo = "foreignobject" sfO = "foreignObject" ) if got := Lookup([]byte(sfo)); got != afo { t.Errorf("Lookup(%q): got %#v, want %#v", sfo, got, afo) } if got := Lookup([]byte(sfO)); got != afO { t.Errorf("Lookup(%q): got %#v, want %#v", sfO, got, afO) } if got := afo.String(); got != sfo { t.Errorf("Atom(%#v).String(): got %q, want %q", afo, got, sfo) } if got := afO.String(); got != sfO { t.Errorf("Atom(%#v).String(): got %q, want %q", afO, got, sfO) } } func BenchmarkLookup(b *testing.B) { sortedTable := make([]string, 0, len(table)) for _, a := range table { if a != 0 { sortedTable = append(sortedTable, a.String()) } } sort.Strings(sortedTable) x := make([][]byte, 1000) for i := range x { x[i] = []byte(sortedTable[i%len(sortedTable)]) } b.ResetTimer() for i := 0; i < b.N; i++ { for _, s := range x { Lookup(s) } } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/atom/atom.go����������������������������������������������������������������������������0000644�0001751�0001751�00000004352�12235217213�014521� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// 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. // Package atom provides integer codes (also known as atoms) for a fixed set of // frequently occurring HTML strings: tag names and attribute keys such as "p" // and "id". // // Sharing an atom's name between all elements with the same tag can result in // fewer string allocations when tokenizing and parsing HTML. Integer // comparisons are also generally faster than string comparisons. // // The value of an atom's particular code is not guaranteed to stay the same // between versions of this package. Neither is any ordering guaranteed: // whether atom.H1 < atom.H2 may also change. The codes are not guaranteed to // be dense. The only guarantees are that e.g. looking up "div" will yield // atom.Div, calling atom.Div.String will return "div", and atom.Div != 0. package atom // Atom is an integer code for a string. The zero value maps to "". type Atom uint32 // String returns the atom's name. func (a Atom) String() string { start := uint32(a >> 8) n := uint32(a & 0xff) if start+n > uint32(len(atomText)) { return "" } return atomText[start : start+n] } func (a Atom) string() string { return atomText[a>>8 : a>>8+a&0xff] } // fnv computes the FNV hash with an arbitrary starting value h. func fnv(h uint32, s []byte) uint32 { for i := range s { h ^= uint32(s[i]) h *= 16777619 } return h } func match(s string, t []byte) bool { for i, c := range t { if s[i] != c { return false } } return true } // Lookup returns the atom whose name is s. It returns zero if there is no // such atom. The lookup is case sensitive. func Lookup(s []byte) Atom { if len(s) == 0 || len(s) > maxAtomLen { return 0 } h := fnv(hash0, s) if a := table[h&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) { return a } if a := table[(h>>16)&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) { return a } return 0 } // String returns a string whose contents are equal to s. In that sense, it is // equivalent to string(s) but may be more efficient. func String(s []byte) string { if a := Lookup(s); a != 0 { return a.String() } return string(s) } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/atom/table_test.go����������������������������������������������������������������������0000644�0001751�0001751�00000007505�12235217213�015712� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// generated by go run gen.go -test; DO NOT EDIT package atom var testAtomList = []string{ "a", "abbr", "accept", "accept-charset", "accesskey", "action", "address", "align", "alt", "annotation", "annotation-xml", "applet", "area", "article", "aside", "async", "audio", "autocomplete", "autofocus", "autoplay", "b", "base", "basefont", "bdi", "bdo", "bgsound", "big", "blink", "blockquote", "body", "border", "br", "button", "canvas", "caption", "center", "challenge", "charset", "checked", "cite", "cite", "class", "code", "col", "colgroup", "color", "cols", "colspan", "command", "command", "content", "contenteditable", "contextmenu", "controls", "coords", "crossorigin", "data", "data", "datalist", "datetime", "dd", "default", "defer", "del", "desc", "details", "dfn", "dialog", "dir", "dirname", "disabled", "div", "dl", "download", "draggable", "dropzone", "dt", "em", "embed", "enctype", "face", "fieldset", "figcaption", "figure", "font", "footer", "for", "foreignObject", "foreignobject", "form", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "frame", "frameset", "h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "headers", "height", "hgroup", "hidden", "high", "hr", "href", "hreflang", "html", "http-equiv", "i", "icon", "id", "iframe", "image", "img", "inert", "input", "ins", "isindex", "ismap", "itemid", "itemprop", "itemref", "itemscope", "itemtype", "kbd", "keygen", "keytype", "kind", "label", "label", "lang", "legend", "li", "link", "list", "listing", "loop", "low", "malignmark", "manifest", "map", "mark", "marquee", "math", "max", "maxlength", "media", "mediagroup", "menu", "meta", "meter", "method", "mglyph", "mi", "min", "mn", "mo", "ms", "mtext", "multiple", "muted", "name", "nav", "nobr", "noembed", "noframes", "noscript", "novalidate", "object", "ol", "onabort", "onafterprint", "onbeforeprint", "onbeforeunload", "onblur", "oncancel", "oncanplay", "oncanplaythrough", "onchange", "onclick", "onclose", "oncontextmenu", "oncuechange", "ondblclick", "ondrag", "ondragend", "ondragenter", "ondragleave", "ondragover", "ondragstart", "ondrop", "ondurationchange", "onemptied", "onended", "onerror", "onfocus", "onhashchange", "oninput", "oninvalid", "onkeydown", "onkeypress", "onkeyup", "onload", "onloadeddata", "onloadedmetadata", "onloadstart", "onmessage", "onmousedown", "onmousemove", "onmouseout", "onmouseover", "onmouseup", "onmousewheel", "onoffline", "ononline", "onpagehide", "onpageshow", "onpause", "onplay", "onplaying", "onpopstate", "onprogress", "onratechange", "onreset", "onresize", "onscroll", "onseeked", "onseeking", "onselect", "onshow", "onstalled", "onstorage", "onsubmit", "onsuspend", "ontimeupdate", "onunload", "onvolumechange", "onwaiting", "open", "optgroup", "optimum", "option", "output", "p", "param", "pattern", "ping", "placeholder", "plaintext", "poster", "pre", "preload", "progress", "prompt", "public", "q", "radiogroup", "readonly", "rel", "required", "reversed", "rows", "rowspan", "rp", "rt", "ruby", "s", "samp", "sandbox", "scope", "scoped", "script", "seamless", "section", "select", "selected", "shape", "size", "sizes", "small", "source", "spacer", "span", "span", "spellcheck", "src", "srcdoc", "srclang", "start", "step", "strike", "strong", "style", "style", "sub", "summary", "sup", "svg", "system", "tabindex", "table", "target", "tbody", "td", "textarea", "tfoot", "th", "thead", "time", "title", "title", "tr", "track", "translate", "tt", "type", "typemustmatch", "u", "ul", "usemap", "value", "var", "video", "wbr", "width", "wrap", "xmp", } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/�������������������������������������������������������������������������������0000755�0001751�0001751�00000000000�12235217213�014077� 5����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/������������������������������������������������������������������������0000755�0001751�0001751�00000000000�12235217213�015364� 5����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests9.dat��������������������������������������������������������������0000644�0001751�0001751�00000027010�12235217213�017311� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <!DOCTYPE html><math></math> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> #data <!DOCTYPE html><body><math></math> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> #data <!DOCTYPE html><math><mi> #errors 25: End of file in a foreign namespace context. #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | <math mi> #data <!DOCTYPE html><math><annotation-xml><svg><u> #errors 45: HTML start tag “u” in a foreign namespace context. 45: End of file seen and there were open elements. #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | <math annotation-xml> | <svg svg> | <u> #data <!DOCTYPE html><body><select><math></math></select> #errors Line: 1 Col: 35 Unexpected start tag token (math) in the select phase. Ignored. Line: 1 Col: 42 Unexpected end tag (math) in the select phase. Ignored. #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> #data <!DOCTYPE html><body><select><option><math></math></option></select> #errors Line: 1 Col: 43 Unexpected start tag token (math) in the select phase. Ignored. Line: 1 Col: 50 Unexpected end tag (math) in the select phase. Ignored. #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | <option> #data <!DOCTYPE html><body><table><math></math></table> #errors Line: 1 Col: 34 Unexpected start tag (math) in table context caused voodoo mode. Line: 1 Col: 41 Unexpected end tag (math) in table context caused voodoo mode. #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | <table> #data <!DOCTYPE html><body><table><math><mi>foo</mi></math></table> #errors Line: 1 Col: 34 Unexpected start tag (math) in table context caused voodoo mode. Line: 1 Col: 46 Unexpected end tag (mi) in table context caused voodoo mode. Line: 1 Col: 53 Unexpected end tag (math) in table context caused voodoo mode. #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | <math mi> | "foo" | <table> #data <!DOCTYPE html><body><table><math><mi>foo</mi><mi>bar</mi></math></table> #errors Line: 1 Col: 34 Unexpected start tag (math) in table context caused voodoo mode. Line: 1 Col: 46 Unexpected end tag (mi) in table context caused voodoo mode. Line: 1 Col: 58 Unexpected end tag (mi) in table context caused voodoo mode. Line: 1 Col: 65 Unexpected end tag (math) in table context caused voodoo mode. #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | <math mi> | "foo" | <math mi> | "bar" | <table> #data <!DOCTYPE html><body><table><tbody><math><mi>foo</mi><mi>bar</mi></math></tbody></table> #errors Line: 1 Col: 41 Unexpected start tag (math) in table context caused voodoo mode. Line: 1 Col: 53 Unexpected end tag (mi) in table context caused voodoo mode. Line: 1 Col: 65 Unexpected end tag (mi) in table context caused voodoo mode. Line: 1 Col: 72 Unexpected end tag (math) in table context caused voodoo mode. #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | <math mi> | "foo" | <math mi> | "bar" | <table> | <tbody> #data <!DOCTYPE html><body><table><tbody><tr><math><mi>foo</mi><mi>bar</mi></math></tr></tbody></table> #errors Line: 1 Col: 45 Unexpected start tag (math) in table context caused voodoo mode. Line: 1 Col: 57 Unexpected end tag (mi) in table context caused voodoo mode. Line: 1 Col: 69 Unexpected end tag (mi) in table context caused voodoo mode. Line: 1 Col: 76 Unexpected end tag (math) in table context caused voodoo mode. #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | <math mi> | "foo" | <math mi> | "bar" | <table> | <tbody> | <tr> #data <!DOCTYPE html><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math></td></tr></tbody></table> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <math math> | <math mi> | "foo" | <math mi> | "bar" #data <!DOCTYPE html><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math><p>baz</td></tr></tbody></table> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <math math> | <math mi> | "foo" | <math mi> | "bar" | <p> | "baz" #data <!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi></math><p>baz</caption></table> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <caption> | <math math> | <math mi> | "foo" | <math mi> | "bar" | <p> | "baz" #data <!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux #errors Line: 1 Col: 70 HTML start tag "p" in a foreign namespace context. Line: 1 Col: 81 Unexpected end table tag in caption. Generates implied end caption. #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <caption> | <math math> | <math mi> | "foo" | <math mi> | "bar" | <p> | "baz" | <p> | "quux" #data <!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi>baz</table><p>quux #errors Line: 1 Col: 78 Unexpected end table tag in caption. Generates implied end caption. Line: 1 Col: 78 Unexpected end tag (caption). Missing end tag (math). #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <caption> | <math math> | <math mi> | "foo" | <math mi> | "bar" | "baz" | <p> | "quux" #data <!DOCTYPE html><body><table><colgroup><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux #errors Line: 1 Col: 44 Unexpected start tag (math) in table context caused voodoo mode. Line: 1 Col: 56 Unexpected end tag (mi) in table context caused voodoo mode. Line: 1 Col: 68 Unexpected end tag (mi) in table context caused voodoo mode. Line: 1 Col: 71 HTML start tag "p" in a foreign namespace context. Line: 1 Col: 71 Unexpected start tag (p) in table context caused voodoo mode. #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | <math mi> | "foo" | <math mi> | "bar" | <p> | "baz" | <table> | <colgroup> | <p> | "quux" #data <!DOCTYPE html><body><table><tr><td><select><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux #errors Line: 1 Col: 50 Unexpected start tag token (math) in the select phase. Ignored. Line: 1 Col: 54 Unexpected start tag token (mi) in the select phase. Ignored. Line: 1 Col: 62 Unexpected end tag (mi) in the select phase. Ignored. Line: 1 Col: 66 Unexpected start tag token (mi) in the select phase. Ignored. Line: 1 Col: 74 Unexpected end tag (mi) in the select phase. Ignored. Line: 1 Col: 77 Unexpected start tag token (p) in the select phase. Ignored. Line: 1 Col: 88 Unexpected table element end tag (tables) in the select in table phase. #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <select> | "foobarbaz" | <p> | "quux" #data <!DOCTYPE html><body><table><select><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux #errors Line: 1 Col: 36 Unexpected start tag (select) in table context caused voodoo mode. Line: 1 Col: 42 Unexpected start tag token (math) in the select phase. Ignored. Line: 1 Col: 46 Unexpected start tag token (mi) in the select phase. Ignored. Line: 1 Col: 54 Unexpected end tag (mi) in the select phase. Ignored. Line: 1 Col: 58 Unexpected start tag token (mi) in the select phase. Ignored. Line: 1 Col: 66 Unexpected end tag (mi) in the select phase. Ignored. Line: 1 Col: 69 Unexpected start tag token (p) in the select phase. Ignored. Line: 1 Col: 80 Unexpected table element end tag (tables) in the select in table phase. #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | "foobarbaz" | <table> | <p> | "quux" #data <!DOCTYPE html><body></body></html><math><mi>foo</mi><mi>bar</mi><p>baz #errors Line: 1 Col: 41 Unexpected start tag (math). Line: 1 Col: 68 HTML start tag "p" in a foreign namespace context. #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | <math mi> | "foo" | <math mi> | "bar" | <p> | "baz" #data <!DOCTYPE html><body></body><math><mi>foo</mi><mi>bar</mi><p>baz #errors Line: 1 Col: 34 Unexpected start tag token (math) in the after body phase. Line: 1 Col: 61 HTML start tag "p" in a foreign namespace context. #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | <math mi> | "foo" | <math mi> | "bar" | <p> | "baz" #data <!DOCTYPE html><frameset><math><mi></mi><mi></mi><p><span> #errors Line: 1 Col: 31 Unexpected start tag token (math) in the frameset phase. Ignored. Line: 1 Col: 35 Unexpected start tag token (mi) in the frameset phase. Ignored. Line: 1 Col: 40 Unexpected end tag token (mi) in the frameset phase. Ignored. Line: 1 Col: 44 Unexpected start tag token (mi) in the frameset phase. Ignored. Line: 1 Col: 49 Unexpected end tag token (mi) in the frameset phase. Ignored. Line: 1 Col: 52 Unexpected start tag token (p) in the frameset phase. Ignored. Line: 1 Col: 58 Unexpected start tag token (span) in the frameset phase. Ignored. Line: 1 Col: 58 Expected closing tag. Unexpected end of file. #document | <!DOCTYPE html> | <html> | <head> | <frameset> #data <!DOCTYPE html><frameset></frameset><math><mi></mi><mi></mi><p><span> #errors Line: 1 Col: 42 Unexpected start tag (math) in the after frameset phase. Ignored. Line: 1 Col: 46 Unexpected start tag (mi) in the after frameset phase. Ignored. Line: 1 Col: 51 Unexpected end tag (mi) in the after frameset phase. Ignored. Line: 1 Col: 55 Unexpected start tag (mi) in the after frameset phase. Ignored. Line: 1 Col: 60 Unexpected end tag (mi) in the after frameset phase. Ignored. Line: 1 Col: 63 Unexpected start tag (p) in the after frameset phase. Ignored. Line: 1 Col: 69 Unexpected start tag (span) in the after frameset phase. Ignored. #document | <!DOCTYPE html> | <html> | <head> | <frameset> #data <!DOCTYPE html><body xlink:href=foo><math xlink:href=foo></math> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | xlink:href="foo" | <math math> | xlink href="foo" #data <!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo></mi></math> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | xlink:href="foo" | xml:lang="en" | <math math> | <math mi> | xlink href="foo" | xml lang="en" #data <!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo /></math> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | xlink:href="foo" | xml:lang="en" | <math math> | <math mi> | xlink href="foo" | xml lang="en" #data <!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo />bar</math> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | xlink:href="foo" | xml:lang="en" | <math math> | <math mi> | xlink href="foo" | xml lang="en" | "bar" ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests3.dat��������������������������������������������������������������0000644�0001751�0001751�00000011626�12235217213�017311� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <head></head><style></style> #errors Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. Line: 1 Col: 20 Unexpected start tag (style) that can be in head. Moved. #document | <html> | <head> | <style> | <body> #data <head></head><script></script> #errors Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. Line: 1 Col: 21 Unexpected start tag (script) that can be in head. Moved. #document | <html> | <head> | <script> | <body> #data <head></head><!-- --><style></style><!-- --><script></script> #errors Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. Line: 1 Col: 28 Unexpected start tag (style) that can be in head. Moved. #document | <html> | <head> | <style> | <script> | <!-- --> | <!-- --> | <body> #data <head></head><!-- -->x<style></style><!-- --><script></script> #errors Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. #document | <html> | <head> | <!-- --> | <body> | "x" | <style> | <!-- --> | <script> #data <!DOCTYPE html><html><head></head><body><pre> </pre></body></html> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <pre> #data <!DOCTYPE html><html><head></head><body><pre> foo</pre></body></html> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <pre> | "foo" #data <!DOCTYPE html><html><head></head><body><pre> foo</pre></body></html> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <pre> | " foo" #data <!DOCTYPE html><html><head></head><body><pre> foo </pre></body></html> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <pre> | "foo " #data <!DOCTYPE html><html><head></head><body><pre>x</pre><span> </span></body></html> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <pre> | "x" | <span> | " " #data <!DOCTYPE html><html><head></head><body><pre>x y</pre></body></html> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <pre> | "x y" #data <!DOCTYPE html><html><head></head><body><pre>x<div> y</pre></body></html> #errors Line: 2 Col: 7 End tag (pre) seen too early. Expected other end tag. #document | <!DOCTYPE html> | <html> | <head> | <body> | <pre> | "x" | <div> | " y" #data <!DOCTYPE html><pre>&#x0a;&#x0a;A</pre> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <pre> | " A" #data <!DOCTYPE html><HTML><META><HEAD></HEAD></HTML> #errors Line: 1 Col: 33 Unexpected start tag head in existing head. Ignored. #document | <!DOCTYPE html> | <html> | <head> | <meta> | <body> #data <!DOCTYPE html><HTML><HEAD><head></HEAD></HTML> #errors Line: 1 Col: 33 Unexpected start tag head in existing head. Ignored. #document | <!DOCTYPE html> | <html> | <head> | <body> #data <textarea>foo<span>bar</span><i>baz #errors Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. Line: 1 Col: 35 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <textarea> | "foo<span>bar</span><i>baz" #data <title>foo<span>bar</em><i>baz #errors Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. Line: 1 Col: 30 Unexpected end of file. Expected end tag (title). #document | <html> | <head> | <title> | "foo<span>bar</em><i>baz" | <body> #data <!DOCTYPE html><textarea> </textarea> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <textarea> #data <!DOCTYPE html><textarea> foo</textarea> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <textarea> | "foo" #data <!DOCTYPE html><textarea> foo</textarea> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <textarea> | " foo" #data <!DOCTYPE html><html><head></head><body><ul><li><div><p><li></ul></body></html> #errors Line: 1 Col: 60 Missing end tag (div, li). #document | <!DOCTYPE html> | <html> | <head> | <body> | <ul> | <li> | <div> | <p> | <li> #data <!doctype html><nobr><nobr><nobr> #errors Line: 1 Col: 27 Unexpected start tag (nobr) implies end tag (nobr). Line: 1 Col: 33 Unexpected start tag (nobr) implies end tag (nobr). Line: 1 Col: 33 Expected closing tag. Unexpected end of file. #document | <!DOCTYPE html> | <html> | <head> | <body> | <nobr> | <nobr> | <nobr> #data <!doctype html><nobr><nobr></nobr><nobr> #errors Line: 1 Col: 27 Unexpected start tag (nobr) implies end tag (nobr). Line: 1 Col: 40 Expected closing tag. Unexpected end of file. #document | <!DOCTYPE html> | <html> | <head> | <body> | <nobr> | <nobr> | <nobr> #data <!doctype html><html><body><p><table></table></body></html> #errors Not known #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <table> #data <p><table></table> #errors Not known #document | <html> | <head> | <body> | <p> | <table> ����������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/inbody01.dat������������������������������������������������������������0000644�0001751�0001751�00000000665�12235217213�017512� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <button>1</foo> #errors #document | <html> | <head> | <body> | <button> | "1" #data <foo>1<p>2</foo> #errors #document | <html> | <head> | <body> | <foo> | "1" | <p> | "2" #data <dd>1</foo> #errors #document | <html> | <head> | <body> | <dd> | "1" #data <foo>1<dd>2</foo> #errors #document | <html> | <head> | <body> | <foo> | "1" | <dd> | "2" ���������������������������������������������������������������������������go.net/html/testdata/webkit/tests25.dat�������������������������������������������������������������0000644�0001751�0001751�00000005025�12235217213�017371� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <!DOCTYPE html><body><foo>A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <foo> | "A" #data <!DOCTYPE html><body><area>A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <area> | "A" #data <!DOCTYPE html><body><base>A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <base> | "A" #data <!DOCTYPE html><body><basefont>A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <basefont> | "A" #data <!DOCTYPE html><body><bgsound>A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <bgsound> | "A" #data <!DOCTYPE html><body><br>A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <br> | "A" #data <!DOCTYPE html><body><col>A #errors 26: Stray start tag “col”. #document | <!DOCTYPE html> | <html> | <head> | <body> | "A" #data <!DOCTYPE html><body><command>A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <command> | "A" #data <!DOCTYPE html><body><embed>A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <embed> | "A" #data <!DOCTYPE html><body><frame>A #errors 26: Stray start tag “frame”. #document | <!DOCTYPE html> | <html> | <head> | <body> | "A" #data <!DOCTYPE html><body><hr>A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <hr> | "A" #data <!DOCTYPE html><body><img>A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <img> | "A" #data <!DOCTYPE html><body><input>A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <input> | "A" #data <!DOCTYPE html><body><keygen>A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <keygen> | "A" #data <!DOCTYPE html><body><link>A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <link> | "A" #data <!DOCTYPE html><body><meta>A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <meta> | "A" #data <!DOCTYPE html><body><param>A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <param> | "A" #data <!DOCTYPE html><body><source>A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <source> | "A" #data <!DOCTYPE html><body><track>A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <track> | "A" #data <!DOCTYPE html><body><wbr>A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <wbr> | "A" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/pending-spec-changes.dat������������������������������������������������0000644�0001751�0001751�00000002455�12235217213�022046� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <input type="hidden"><frameset> #errors 21: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. 31: “frameset” start tag seen. 31: End of file seen and there were open elements. #document | <html> | <head> | <frameset> #data <!DOCTYPE html><table><caption><svg>foo</table>bar #errors 47: End tag “table” did not match the name of the current open element (“svg”). 47: “table” closed but “caption” was still open. 47: End tag “table” seen, but there were open elements. 36: Unclosed element “svg”. #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <caption> | <svg svg> | "foo" | "bar" #data <table><tr><td><svg><desc><td></desc><circle> #errors 7: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. 30: A table cell was implicitly closed, but there were open elements. 26: Unclosed element “desc”. 20: Unclosed element “svg”. 37: Stray end tag “desc”. 45: End of file seen and there were open elements. 45: Unclosed element “circle”. 7: Unclosed element “table”. #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <svg svg> | <svg desc> | <td> | <circle> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests10.dat�������������������������������������������������������������0000644�0001751�0001751�00000033335�12235217213�017370� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <!DOCTYPE html><svg></svg> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> #data <!DOCTYPE html><svg></svg><![CDATA[a]]> #errors 29: Bogus comment #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | <!-- [CDATA[a]] --> #data <!DOCTYPE html><body><svg></svg> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> #data <!DOCTYPE html><body><select><svg></svg></select> #errors 35: Stray “svg” start tag. 42: Stray end tag “svg” #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> #data <!DOCTYPE html><body><select><option><svg></svg></option></select> #errors 43: Stray “svg” start tag. 50: Stray end tag “svg” #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | <option> #data <!DOCTYPE html><body><table><svg></svg></table> #errors 34: Start tag “svg” seen in “table”. 41: Stray end tag “svg”. #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | <table> #data <!DOCTYPE html><body><table><svg><g>foo</g></svg></table> #errors 34: Start tag “svg” seen in “table”. 46: Stray end tag “g”. 53: Stray end tag “svg”. #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | <svg g> | "foo" | <table> #data <!DOCTYPE html><body><table><svg><g>foo</g><g>bar</g></svg></table> #errors 34: Start tag “svg” seen in “table”. 46: Stray end tag “g”. 58: Stray end tag “g”. 65: Stray end tag “svg”. #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | <svg g> | "foo" | <svg g> | "bar" | <table> #data <!DOCTYPE html><body><table><tbody><svg><g>foo</g><g>bar</g></svg></tbody></table> #errors 41: Start tag “svg” seen in “table”. 53: Stray end tag “g”. 65: Stray end tag “g”. 72: Stray end tag “svg”. #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | <svg g> | "foo" | <svg g> | "bar" | <table> | <tbody> #data <!DOCTYPE html><body><table><tbody><tr><svg><g>foo</g><g>bar</g></svg></tr></tbody></table> #errors 45: Start tag “svg” seen in “table”. 57: Stray end tag “g”. 69: Stray end tag “g”. 76: Stray end tag “svg”. #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | <svg g> | "foo" | <svg g> | "bar" | <table> | <tbody> | <tr> #data <!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg></td></tr></tbody></table> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <svg svg> | <svg g> | "foo" | <svg g> | "bar" #data <!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg><p>baz</td></tr></tbody></table> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <svg svg> | <svg g> | "foo" | <svg g> | "bar" | <p> | "baz" #data <!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g></svg><p>baz</caption></table> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <caption> | <svg svg> | <svg g> | "foo" | <svg g> | "bar" | <p> | "baz" #data <!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g><p>baz</table><p>quux #errors 70: HTML start tag “p” in a foreign namespace context. 81: “table” closed but “caption” was still open. #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <caption> | <svg svg> | <svg g> | "foo" | <svg g> | "bar" | <p> | "baz" | <p> | "quux" #data <!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g>baz</table><p>quux #errors 78: “table” closed but “caption” was still open. 78: Unclosed elements on stack. #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <caption> | <svg svg> | <svg g> | "foo" | <svg g> | "bar" | "baz" | <p> | "quux" #data <!DOCTYPE html><body><table><colgroup><svg><g>foo</g><g>bar</g><p>baz</table><p>quux #errors 44: Start tag “svg” seen in “table”. 56: Stray end tag “g”. 68: Stray end tag “g”. 71: HTML start tag “p” in a foreign namespace context. 71: Start tag “p” seen in “table”. #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | <svg g> | "foo" | <svg g> | "bar" | <p> | "baz" | <table> | <colgroup> | <p> | "quux" #data <!DOCTYPE html><body><table><tr><td><select><svg><g>foo</g><g>bar</g><p>baz</table><p>quux #errors 50: Stray “svg” start tag. 54: Stray “g” start tag. 62: Stray end tag “g” 66: Stray “g” start tag. 74: Stray end tag “g” 77: Stray “p” start tag. 88: “table” end tag with “select” open. #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <select> | "foobarbaz" | <p> | "quux" #data <!DOCTYPE html><body><table><select><svg><g>foo</g><g>bar</g><p>baz</table><p>quux #errors 36: Start tag “select” seen in “table”. 42: Stray “svg” start tag. 46: Stray “g” start tag. 54: Stray end tag “g” 58: Stray “g” start tag. 66: Stray end tag “g” 69: Stray “p” start tag. 80: “table” end tag with “select” open. #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | "foobarbaz" | <table> | <p> | "quux" #data <!DOCTYPE html><body></body></html><svg><g>foo</g><g>bar</g><p>baz #errors 41: Stray “svg” start tag. 68: HTML start tag “p” in a foreign namespace context. #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | <svg g> | "foo" | <svg g> | "bar" | <p> | "baz" #data <!DOCTYPE html><body></body><svg><g>foo</g><g>bar</g><p>baz #errors 34: Stray “svg” start tag. 61: HTML start tag “p” in a foreign namespace context. #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | <svg g> | "foo" | <svg g> | "bar" | <p> | "baz" #data <!DOCTYPE html><frameset><svg><g></g><g></g><p><span> #errors 31: Stray “svg” start tag. 35: Stray “g” start tag. 40: Stray end tag “g” 44: Stray “g” start tag. 49: Stray end tag “g” 52: Stray “p” start tag. 58: Stray “span” start tag. 58: End of file seen and there were open elements. #document | <!DOCTYPE html> | <html> | <head> | <frameset> #data <!DOCTYPE html><frameset></frameset><svg><g></g><g></g><p><span> #errors 42: Stray “svg” start tag. 46: Stray “g” start tag. 51: Stray end tag “g” 55: Stray “g” start tag. 60: Stray end tag “g” 63: Stray “p” start tag. 69: Stray “span” start tag. #document | <!DOCTYPE html> | <html> | <head> | <frameset> #data <!DOCTYPE html><body xlink:href=foo><svg xlink:href=foo></svg> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | xlink:href="foo" | <svg svg> | xlink href="foo" #data <!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo></g></svg> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | xlink:href="foo" | xml:lang="en" | <svg svg> | <svg g> | xlink href="foo" | xml lang="en" #data <!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo /></svg> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | xlink:href="foo" | xml:lang="en" | <svg svg> | <svg g> | xlink href="foo" | xml lang="en" #data <!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo />bar</svg> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | xlink:href="foo" | xml:lang="en" | <svg svg> | <svg g> | xlink href="foo" | xml lang="en" | "bar" #data <svg></path> #errors #document | <html> | <head> | <body> | <svg svg> #data <div><svg></div>a #errors #document | <html> | <head> | <body> | <div> | <svg svg> | "a" #data <div><svg><path></div>a #errors #document | <html> | <head> | <body> | <div> | <svg svg> | <svg path> | "a" #data <div><svg><path></svg><path> #errors #document | <html> | <head> | <body> | <div> | <svg svg> | <svg path> | <path> #data <div><svg><path><foreignObject><math></div>a #errors #document | <html> | <head> | <body> | <div> | <svg svg> | <svg path> | <svg foreignObject> | <math math> | "a" #data <div><svg><path><foreignObject><p></div>a #errors #document | <html> | <head> | <body> | <div> | <svg svg> | <svg path> | <svg foreignObject> | <p> | "a" #data <!DOCTYPE html><svg><desc><div><svg><ul>a #errors 40: HTML start tag “ul” in a foreign namespace context. 41: End of file in a foreign namespace context. #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | <svg desc> | <div> | <svg svg> | <ul> | "a" #data <!DOCTYPE html><svg><desc><svg><ul>a #errors 35: HTML start tag “ul” in a foreign namespace context. 36: End of file in a foreign namespace context. #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | <svg desc> | <svg svg> | <ul> | "a" #data <!DOCTYPE html><p><svg><desc><p> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <svg svg> | <svg desc> | <p> #data <!DOCTYPE html><p><svg><title><p> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <svg svg> | <svg title> | <p> #data <div><svg><path><foreignObject><p></foreignObject><p> #errors #document | <html> | <head> | <body> | <div> | <svg svg> | <svg path> | <svg foreignObject> | <p> | <p> #data <math><mi><div><object><div><span></span></div></object></div></mi><mi> #errors #document | <html> | <head> | <body> | <math math> | <math mi> | <div> | <object> | <div> | <span> | <math mi> #data <math><mi><svg><foreignObject><div><div></div></div></foreignObject></svg></mi><mi> #errors #document | <html> | <head> | <body> | <math math> | <math mi> | <svg svg> | <svg foreignObject> | <div> | <div> | <math mi> #data <svg><script></script><path> #errors #document | <html> | <head> | <body> | <svg svg> | <svg script> | <svg path> #data <table><svg></svg><tr> #errors #document | <html> | <head> | <body> | <svg svg> | <table> | <tbody> | <tr> #data <math><mi><mglyph> #errors #document | <html> | <head> | <body> | <math math> | <math mi> | <math mglyph> #data <math><mi><malignmark> #errors #document | <html> | <head> | <body> | <math math> | <math mi> | <math malignmark> #data <math><mo><mglyph> #errors #document | <html> | <head> | <body> | <math math> | <math mo> | <math mglyph> #data <math><mo><malignmark> #errors #document | <html> | <head> | <body> | <math math> | <math mo> | <math malignmark> #data <math><mn><mglyph> #errors #document | <html> | <head> | <body> | <math math> | <math mn> | <math mglyph> #data <math><mn><malignmark> #errors #document | <html> | <head> | <body> | <math math> | <math mn> | <math malignmark> #data <math><ms><mglyph> #errors #document | <html> | <head> | <body> | <math math> | <math ms> | <math mglyph> #data <math><ms><malignmark> #errors #document | <html> | <head> | <body> | <math math> | <math ms> | <math malignmark> #data <math><mtext><mglyph> #errors #document | <html> | <head> | <body> | <math math> | <math mtext> | <math mglyph> #data <math><mtext><malignmark> #errors #document | <html> | <head> | <body> | <math math> | <math mtext> | <math malignmark> #data <math><annotation-xml><svg></svg></annotation-xml><mi> #errors #document | <html> | <head> | <body> | <math math> | <math annotation-xml> | <svg svg> | <math mi> #data <math><annotation-xml><svg><foreignObject><div><math><mi></mi></math><span></span></div></foreignObject><path></path></svg></annotation-xml><mi> #errors #document | <html> | <head> | <body> | <math math> | <math annotation-xml> | <svg svg> | <svg foreignObject> | <div> | <math math> | <math mi> | <span> | <svg path> | <math mi> #data <math><annotation-xml><svg><foreignObject><math><mi><svg></svg></mi><mo></mo></math><span></span></foreignObject><path></path></svg></annotation-xml><mi> #errors #document | <html> | <head> | <body> | <math math> | <math annotation-xml> | <svg svg> | <svg foreignObject> | <math math> | <math mi> | <svg svg> | <math mo> | <span> | <svg path> | <math mi> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests23.dat�������������������������������������������������������������0000644�0001751�0001751�00000005762�12235217213�017377� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <p><font size=4><font color=red><font size=4><font size=4><font size=4><font size=4><font size=4><font color=red><p>X #errors 3: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. 116: Unclosed elements. 117: End of file seen and there were open elements. #document | <html> | <head> | <body> | <p> | <font> | size="4" | <font> | color="red" | <font> | size="4" | <font> | size="4" | <font> | size="4" | <font> | size="4" | <font> | size="4" | <font> | color="red" | <p> | <font> | color="red" | <font> | size="4" | <font> | size="4" | <font> | size="4" | <font> | color="red" | "X" #data <p><font size=4><font size=4><font size=4><font size=4><p>X #errors #document | <html> | <head> | <body> | <p> | <font> | size="4" | <font> | size="4" | <font> | size="4" | <font> | size="4" | <p> | <font> | size="4" | <font> | size="4" | <font> | size="4" | "X" #data <p><font size=4><font size=4><font size=4><font size="5"><font size=4><p>X #errors #document | <html> | <head> | <body> | <p> | <font> | size="4" | <font> | size="4" | <font> | size="4" | <font> | size="5" | <font> | size="4" | <p> | <font> | size="4" | <font> | size="4" | <font> | size="5" | <font> | size="4" | "X" #data <p><font size=4 id=a><font size=4 id=b><font size=4><font size=4><p>X #errors #document | <html> | <head> | <body> | <p> | <font> | id="a" | size="4" | <font> | id="b" | size="4" | <font> | size="4" | <font> | size="4" | <p> | <font> | id="a" | size="4" | <font> | id="b" | size="4" | <font> | size="4" | <font> | size="4" | "X" #data <p><b id=a><b id=a><b id=a><b><object><b id=a><b id=a>X</object><p>Y #errors #document | <html> | <head> | <body> | <p> | <b> | id="a" | <b> | id="a" | <b> | id="a" | <b> | <object> | <b> | id="a" | <b> | id="a" | "X" | <p> | <b> | id="a" | <b> | id="a" | <b> | id="a" | <b> | "Y" ��������������go.net/html/testdata/webkit/tests11.dat�������������������������������������������������������������0000644�0001751�0001751�00000041375�12235217213�017374� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <!DOCTYPE html><body><svg attributeName='' attributeType='' baseFrequency='' baseProfile='' calcMode='' clipPathUnits='' contentScriptType='' contentStyleType='' diffuseConstant='' edgeMode='' externalResourcesRequired='' filterRes='' filterUnits='' glyphRef='' gradientTransform='' gradientUnits='' kernelMatrix='' kernelUnitLength='' keyPoints='' keySplines='' keyTimes='' lengthAdjust='' limitingConeAngle='' markerHeight='' markerUnits='' markerWidth='' maskContentUnits='' maskUnits='' numOctaves='' pathLength='' patternContentUnits='' patternTransform='' patternUnits='' pointsAtX='' pointsAtY='' pointsAtZ='' preserveAlpha='' preserveAspectRatio='' primitiveUnits='' refX='' refY='' repeatCount='' repeatDur='' requiredExtensions='' requiredFeatures='' specularConstant='' specularExponent='' spreadMethod='' startOffset='' stdDeviation='' stitchTiles='' surfaceScale='' systemLanguage='' tableValues='' targetX='' targetY='' textLength='' viewBox='' viewTarget='' xChannelSelector='' yChannelSelector='' zoomAndPan=''></svg> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | attributeName="" | attributeType="" | baseFrequency="" | baseProfile="" | calcMode="" | clipPathUnits="" | contentScriptType="" | contentStyleType="" | diffuseConstant="" | edgeMode="" | externalResourcesRequired="" | filterRes="" | filterUnits="" | glyphRef="" | gradientTransform="" | gradientUnits="" | kernelMatrix="" | kernelUnitLength="" | keyPoints="" | keySplines="" | keyTimes="" | lengthAdjust="" | limitingConeAngle="" | markerHeight="" | markerUnits="" | markerWidth="" | maskContentUnits="" | maskUnits="" | numOctaves="" | pathLength="" | patternContentUnits="" | patternTransform="" | patternUnits="" | pointsAtX="" | pointsAtY="" | pointsAtZ="" | preserveAlpha="" | preserveAspectRatio="" | primitiveUnits="" | refX="" | refY="" | repeatCount="" | repeatDur="" | requiredExtensions="" | requiredFeatures="" | specularConstant="" | specularExponent="" | spreadMethod="" | startOffset="" | stdDeviation="" | stitchTiles="" | surfaceScale="" | systemLanguage="" | tableValues="" | targetX="" | targetY="" | textLength="" | viewBox="" | viewTarget="" | xChannelSelector="" | yChannelSelector="" | zoomAndPan="" #data <!DOCTYPE html><BODY><SVG ATTRIBUTENAME='' ATTRIBUTETYPE='' BASEFREQUENCY='' BASEPROFILE='' CALCMODE='' CLIPPATHUNITS='' CONTENTSCRIPTTYPE='' CONTENTSTYLETYPE='' DIFFUSECONSTANT='' EDGEMODE='' EXTERNALRESOURCESREQUIRED='' FILTERRES='' FILTERUNITS='' GLYPHREF='' GRADIENTTRANSFORM='' GRADIENTUNITS='' KERNELMATRIX='' KERNELUNITLENGTH='' KEYPOINTS='' KEYSPLINES='' KEYTIMES='' LENGTHADJUST='' LIMITINGCONEANGLE='' MARKERHEIGHT='' MARKERUNITS='' MARKERWIDTH='' MASKCONTENTUNITS='' MASKUNITS='' NUMOCTAVES='' PATHLENGTH='' PATTERNCONTENTUNITS='' PATTERNTRANSFORM='' PATTERNUNITS='' POINTSATX='' POINTSATY='' POINTSATZ='' PRESERVEALPHA='' PRESERVEASPECTRATIO='' PRIMITIVEUNITS='' REFX='' REFY='' REPEATCOUNT='' REPEATDUR='' REQUIREDEXTENSIONS='' REQUIREDFEATURES='' SPECULARCONSTANT='' SPECULAREXPONENT='' SPREADMETHOD='' STARTOFFSET='' STDDEVIATION='' STITCHTILES='' SURFACESCALE='' SYSTEMLANGUAGE='' TABLEVALUES='' TARGETX='' TARGETY='' TEXTLENGTH='' VIEWBOX='' VIEWTARGET='' XCHANNELSELECTOR='' YCHANNELSELECTOR='' ZOOMANDPAN=''></SVG> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | attributeName="" | attributeType="" | baseFrequency="" | baseProfile="" | calcMode="" | clipPathUnits="" | contentScriptType="" | contentStyleType="" | diffuseConstant="" | edgeMode="" | externalResourcesRequired="" | filterRes="" | filterUnits="" | glyphRef="" | gradientTransform="" | gradientUnits="" | kernelMatrix="" | kernelUnitLength="" | keyPoints="" | keySplines="" | keyTimes="" | lengthAdjust="" | limitingConeAngle="" | markerHeight="" | markerUnits="" | markerWidth="" | maskContentUnits="" | maskUnits="" | numOctaves="" | pathLength="" | patternContentUnits="" | patternTransform="" | patternUnits="" | pointsAtX="" | pointsAtY="" | pointsAtZ="" | preserveAlpha="" | preserveAspectRatio="" | primitiveUnits="" | refX="" | refY="" | repeatCount="" | repeatDur="" | requiredExtensions="" | requiredFeatures="" | specularConstant="" | specularExponent="" | spreadMethod="" | startOffset="" | stdDeviation="" | stitchTiles="" | surfaceScale="" | systemLanguage="" | tableValues="" | targetX="" | targetY="" | textLength="" | viewBox="" | viewTarget="" | xChannelSelector="" | yChannelSelector="" | zoomAndPan="" #data <!DOCTYPE html><body><svg attributename='' attributetype='' basefrequency='' baseprofile='' calcmode='' clippathunits='' contentscripttype='' contentstyletype='' diffuseconstant='' edgemode='' externalresourcesrequired='' filterres='' filterunits='' glyphref='' gradienttransform='' gradientunits='' kernelmatrix='' kernelunitlength='' keypoints='' keysplines='' keytimes='' lengthadjust='' limitingconeangle='' markerheight='' markerunits='' markerwidth='' maskcontentunits='' maskunits='' numoctaves='' pathlength='' patterncontentunits='' patterntransform='' patternunits='' pointsatx='' pointsaty='' pointsatz='' preservealpha='' preserveaspectratio='' primitiveunits='' refx='' refy='' repeatcount='' repeatdur='' requiredextensions='' requiredfeatures='' specularconstant='' specularexponent='' spreadmethod='' startoffset='' stddeviation='' stitchtiles='' surfacescale='' systemlanguage='' tablevalues='' targetx='' targety='' textlength='' viewbox='' viewtarget='' xchannelselector='' ychannelselector='' zoomandpan=''></svg> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | attributeName="" | attributeType="" | baseFrequency="" | baseProfile="" | calcMode="" | clipPathUnits="" | contentScriptType="" | contentStyleType="" | diffuseConstant="" | edgeMode="" | externalResourcesRequired="" | filterRes="" | filterUnits="" | glyphRef="" | gradientTransform="" | gradientUnits="" | kernelMatrix="" | kernelUnitLength="" | keyPoints="" | keySplines="" | keyTimes="" | lengthAdjust="" | limitingConeAngle="" | markerHeight="" | markerUnits="" | markerWidth="" | maskContentUnits="" | maskUnits="" | numOctaves="" | pathLength="" | patternContentUnits="" | patternTransform="" | patternUnits="" | pointsAtX="" | pointsAtY="" | pointsAtZ="" | preserveAlpha="" | preserveAspectRatio="" | primitiveUnits="" | refX="" | refY="" | repeatCount="" | repeatDur="" | requiredExtensions="" | requiredFeatures="" | specularConstant="" | specularExponent="" | spreadMethod="" | startOffset="" | stdDeviation="" | stitchTiles="" | surfaceScale="" | systemLanguage="" | tableValues="" | targetX="" | targetY="" | textLength="" | viewBox="" | viewTarget="" | xChannelSelector="" | yChannelSelector="" | zoomAndPan="" #data <!DOCTYPE html><body><math attributeName='' attributeType='' baseFrequency='' baseProfile='' calcMode='' clipPathUnits='' contentScriptType='' contentStyleType='' diffuseConstant='' edgeMode='' externalResourcesRequired='' filterRes='' filterUnits='' glyphRef='' gradientTransform='' gradientUnits='' kernelMatrix='' kernelUnitLength='' keyPoints='' keySplines='' keyTimes='' lengthAdjust='' limitingConeAngle='' markerHeight='' markerUnits='' markerWidth='' maskContentUnits='' maskUnits='' numOctaves='' pathLength='' patternContentUnits='' patternTransform='' patternUnits='' pointsAtX='' pointsAtY='' pointsAtZ='' preserveAlpha='' preserveAspectRatio='' primitiveUnits='' refX='' refY='' repeatCount='' repeatDur='' requiredExtensions='' requiredFeatures='' specularConstant='' specularExponent='' spreadMethod='' startOffset='' stdDeviation='' stitchTiles='' surfaceScale='' systemLanguage='' tableValues='' targetX='' targetY='' textLength='' viewBox='' viewTarget='' xChannelSelector='' yChannelSelector='' zoomAndPan=''></math> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | attributename="" | attributetype="" | basefrequency="" | baseprofile="" | calcmode="" | clippathunits="" | contentscripttype="" | contentstyletype="" | diffuseconstant="" | edgemode="" | externalresourcesrequired="" | filterres="" | filterunits="" | glyphref="" | gradienttransform="" | gradientunits="" | kernelmatrix="" | kernelunitlength="" | keypoints="" | keysplines="" | keytimes="" | lengthadjust="" | limitingconeangle="" | markerheight="" | markerunits="" | markerwidth="" | maskcontentunits="" | maskunits="" | numoctaves="" | pathlength="" | patterncontentunits="" | patterntransform="" | patternunits="" | pointsatx="" | pointsaty="" | pointsatz="" | preservealpha="" | preserveaspectratio="" | primitiveunits="" | refx="" | refy="" | repeatcount="" | repeatdur="" | requiredextensions="" | requiredfeatures="" | specularconstant="" | specularexponent="" | spreadmethod="" | startoffset="" | stddeviation="" | stitchtiles="" | surfacescale="" | systemlanguage="" | tablevalues="" | targetx="" | targety="" | textlength="" | viewbox="" | viewtarget="" | xchannelselector="" | ychannelselector="" | zoomandpan="" #data <!DOCTYPE html><body><svg><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></svg> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | <svg altGlyph> | <svg altGlyphDef> | <svg altGlyphItem> | <svg animateColor> | <svg animateMotion> | <svg animateTransform> | <svg clipPath> | <svg feBlend> | <svg feColorMatrix> | <svg feComponentTransfer> | <svg feComposite> | <svg feConvolveMatrix> | <svg feDiffuseLighting> | <svg feDisplacementMap> | <svg feDistantLight> | <svg feFlood> | <svg feFuncA> | <svg feFuncB> | <svg feFuncG> | <svg feFuncR> | <svg feGaussianBlur> | <svg feImage> | <svg feMerge> | <svg feMergeNode> | <svg feMorphology> | <svg feOffset> | <svg fePointLight> | <svg feSpecularLighting> | <svg feSpotLight> | <svg feTile> | <svg feTurbulence> | <svg foreignObject> | <svg glyphRef> | <svg linearGradient> | <svg radialGradient> | <svg textPath> #data <!DOCTYPE html><body><svg><altglyph /><altglyphdef /><altglyphitem /><animatecolor /><animatemotion /><animatetransform /><clippath /><feblend /><fecolormatrix /><fecomponenttransfer /><fecomposite /><feconvolvematrix /><fediffuselighting /><fedisplacementmap /><fedistantlight /><feflood /><fefunca /><fefuncb /><fefuncg /><fefuncr /><fegaussianblur /><feimage /><femerge /><femergenode /><femorphology /><feoffset /><fepointlight /><fespecularlighting /><fespotlight /><fetile /><feturbulence /><foreignobject /><glyphref /><lineargradient /><radialgradient /><textpath /></svg> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | <svg altGlyph> | <svg altGlyphDef> | <svg altGlyphItem> | <svg animateColor> | <svg animateMotion> | <svg animateTransform> | <svg clipPath> | <svg feBlend> | <svg feColorMatrix> | <svg feComponentTransfer> | <svg feComposite> | <svg feConvolveMatrix> | <svg feDiffuseLighting> | <svg feDisplacementMap> | <svg feDistantLight> | <svg feFlood> | <svg feFuncA> | <svg feFuncB> | <svg feFuncG> | <svg feFuncR> | <svg feGaussianBlur> | <svg feImage> | <svg feMerge> | <svg feMergeNode> | <svg feMorphology> | <svg feOffset> | <svg fePointLight> | <svg feSpecularLighting> | <svg feSpotLight> | <svg feTile> | <svg feTurbulence> | <svg foreignObject> | <svg glyphRef> | <svg linearGradient> | <svg radialGradient> | <svg textPath> #data <!DOCTYPE html><BODY><SVG><ALTGLYPH /><ALTGLYPHDEF /><ALTGLYPHITEM /><ANIMATECOLOR /><ANIMATEMOTION /><ANIMATETRANSFORM /><CLIPPATH /><FEBLEND /><FECOLORMATRIX /><FECOMPONENTTRANSFER /><FECOMPOSITE /><FECONVOLVEMATRIX /><FEDIFFUSELIGHTING /><FEDISPLACEMENTMAP /><FEDISTANTLIGHT /><FEFLOOD /><FEFUNCA /><FEFUNCB /><FEFUNCG /><FEFUNCR /><FEGAUSSIANBLUR /><FEIMAGE /><FEMERGE /><FEMERGENODE /><FEMORPHOLOGY /><FEOFFSET /><FEPOINTLIGHT /><FESPECULARLIGHTING /><FESPOTLIGHT /><FETILE /><FETURBULENCE /><FOREIGNOBJECT /><GLYPHREF /><LINEARGRADIENT /><RADIALGRADIENT /><TEXTPATH /></SVG> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | <svg altGlyph> | <svg altGlyphDef> | <svg altGlyphItem> | <svg animateColor> | <svg animateMotion> | <svg animateTransform> | <svg clipPath> | <svg feBlend> | <svg feColorMatrix> | <svg feComponentTransfer> | <svg feComposite> | <svg feConvolveMatrix> | <svg feDiffuseLighting> | <svg feDisplacementMap> | <svg feDistantLight> | <svg feFlood> | <svg feFuncA> | <svg feFuncB> | <svg feFuncG> | <svg feFuncR> | <svg feGaussianBlur> | <svg feImage> | <svg feMerge> | <svg feMergeNode> | <svg feMorphology> | <svg feOffset> | <svg fePointLight> | <svg feSpecularLighting> | <svg feSpotLight> | <svg feTile> | <svg feTurbulence> | <svg foreignObject> | <svg glyphRef> | <svg linearGradient> | <svg radialGradient> | <svg textPath> #data <!DOCTYPE html><body><math><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></math> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | <math altglyph> | <math altglyphdef> | <math altglyphitem> | <math animatecolor> | <math animatemotion> | <math animatetransform> | <math clippath> | <math feblend> | <math fecolormatrix> | <math fecomponenttransfer> | <math fecomposite> | <math feconvolvematrix> | <math fediffuselighting> | <math fedisplacementmap> | <math fedistantlight> | <math feflood> | <math fefunca> | <math fefuncb> | <math fefuncg> | <math fefuncr> | <math fegaussianblur> | <math feimage> | <math femerge> | <math femergenode> | <math femorphology> | <math feoffset> | <math fepointlight> | <math fespecularlighting> | <math fespotlight> | <math fetile> | <math feturbulence> | <math foreignobject> | <math glyphref> | <math lineargradient> | <math radialgradient> | <math textpath> #data <!DOCTYPE html><body><svg><solidColor /></svg> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | <svg solidcolor> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/isindex.dat�������������������������������������������������������������0000644�0001751�0001751�00000001074�12235217213�017523� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <isindex> #errors #document | <html> | <head> | <body> | <form> | <hr> | <label> | "This is a searchable index. Enter search keywords: " | <input> | name="isindex" | <hr> #data <isindex name="A" action="B" prompt="C" foo="D"> #errors #document | <html> | <head> | <body> | <form> | action="B" | <hr> | <label> | "C" | <input> | foo="D" | name="isindex" | <hr> #data <form><isindex> #errors #document | <html> | <head> | <body> | <form> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/adoption02.dat����������������������������������������������������������0000644�0001751�0001751�00000000571�12235217213�020040� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <b>1<i>2<p>3</b>4 #errors #document | <html> | <head> | <body> | <b> | "1" | <i> | "2" | <i> | <p> | <b> | "3" | "4" #data <a><div><style></style><address><a> #errors #document | <html> | <head> | <body> | <a> | <div> | <a> | <style> | <address> | <a> | <a> ���������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests4.dat��������������������������������������������������������������0000644�0001751�0001751�00000001565�12235217213�017313� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data direct div content #errors #document-fragment div #document | "direct div content" #data direct textarea content #errors #document-fragment textarea #document | "direct textarea content" #data textarea content with <em>pseudo</em> <foo>markup #errors #document-fragment textarea #document | "textarea content with <em>pseudo</em> <foo>markup" #data this is &#x0043;DATA inside a <style> element #errors #document-fragment style #document | "this is &#x0043;DATA inside a <style> element" #data </plaintext> #errors #document-fragment plaintext #document | "</plaintext>" #data setting html's innerHTML #errors Line: 1 Col: 24 Unexpected EOF in inner html mode. #document-fragment html #document | <head> | <body> | "setting html's innerHTML" #data <title>setting head's innerHTML</title> #errors #document-fragment head #document | <title> | "setting head's innerHTML" �������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tables01.dat������������������������������������������������������������0000644�0001751�0001751�00000005322�12235217213�017473� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <table><th> #errors #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <th> #data <table><td> #errors #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> #data <table><col foo='bar'> #errors #document | <html> | <head> | <body> | <table> | <colgroup> | <col> | foo="bar" #data <table><colgroup></html>foo #errors #document | <html> | <head> | <body> | "foo" | <table> | <colgroup> #data <table></table><p>foo #errors #document | <html> | <head> | <body> | <table> | <p> | "foo" #data <table></body></caption></col></colgroup></html></tbody></td></tfoot></th></thead></tr><td> #errors #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> #data <table><select><option>3</select></table> #errors #document | <html> | <head> | <body> | <select> | <option> | "3" | <table> #data <table><select><table></table></select></table> #errors #document | <html> | <head> | <body> | <select> | <table> | <table> #data <table><select></table> #errors #document | <html> | <head> | <body> | <select> | <table> #data <table><select><option>A<tr><td>B</td></tr></table> #errors #document | <html> | <head> | <body> | <select> | <option> | "A" | <table> | <tbody> | <tr> | <td> | "B" #data <table><td></body></caption></col></colgroup></html>foo #errors #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | "foo" #data <table><td>A</table>B #errors #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | "A" | "B" #data <table><tr><caption> #errors #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <caption> #data <table><tr></body></caption></col></colgroup></html></td></th><td>foo #errors #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | "foo" #data <table><td><tr> #errors #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <tr> #data <table><td><button><td> #errors #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <button> | <td> #data <table><tr><td><svg><desc><td> #errors #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <svg svg> | <svg desc> | <td> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/entities02.dat����������������������������������������������������������0000644�0001751�0001751�00000005534�12235217213�020053� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <div bar="ZZ&gt;YY"></div> #errors #document | <html> | <head> | <body> | <div> | bar="ZZ>YY" #data <div bar="ZZ&"></div> #errors #document | <html> | <head> | <body> | <div> | bar="ZZ&" #data <div bar='ZZ&'></div> #errors #document | <html> | <head> | <body> | <div> | bar="ZZ&" #data <div bar=ZZ&></div> #errors #document | <html> | <head> | <body> | <div> | bar="ZZ&" #data <div bar="ZZ&gt=YY"></div> #errors #document | <html> | <head> | <body> | <div> | bar="ZZ&gt=YY" #data <div bar="ZZ&gt0YY"></div> #errors #document | <html> | <head> | <body> | <div> | bar="ZZ&gt0YY" #data <div bar="ZZ&gt9YY"></div> #errors #document | <html> | <head> | <body> | <div> | bar="ZZ&gt9YY" #data <div bar="ZZ&gtaYY"></div> #errors #document | <html> | <head> | <body> | <div> | bar="ZZ&gtaYY" #data <div bar="ZZ&gtZYY"></div> #errors #document | <html> | <head> | <body> | <div> | bar="ZZ&gtZYY" #data <div bar="ZZ&gt YY"></div> #errors #document | <html> | <head> | <body> | <div> | bar="ZZ> YY" #data <div bar="ZZ&gt"></div> #errors #document | <html> | <head> | <body> | <div> | bar="ZZ>" #data <div bar='ZZ&gt'></div> #errors #document | <html> | <head> | <body> | <div> | bar="ZZ>" #data <div bar=ZZ&gt></div> #errors #document | <html> | <head> | <body> | <div> | bar="ZZ>" #data <div bar="ZZ&pound_id=23"></div> #errors #document | <html> | <head> | <body> | <div> | bar="ZZ£_id=23" #data <div bar="ZZ&prod_id=23"></div> #errors #document | <html> | <head> | <body> | <div> | bar="ZZ&prod_id=23" #data <div bar="ZZ&pound;_id=23"></div> #errors #document | <html> | <head> | <body> | <div> | bar="ZZ£_id=23" #data <div bar="ZZ&prod;_id=23"></div> #errors #document | <html> | <head> | <body> | <div> | bar="ZZ∏_id=23" #data <div bar="ZZ&pound=23"></div> #errors #document | <html> | <head> | <body> | <div> | bar="ZZ&pound=23" #data <div bar="ZZ&prod=23"></div> #errors #document | <html> | <head> | <body> | <div> | bar="ZZ&prod=23" #data <div>ZZ&pound_id=23</div> #errors #document | <html> | <head> | <body> | <div> | "ZZ£_id=23" #data <div>ZZ&prod_id=23</div> #errors #document | <html> | <head> | <body> | <div> | "ZZ&prod_id=23" #data <div>ZZ&pound;_id=23</div> #errors #document | <html> | <head> | <body> | <div> | "ZZ£_id=23" #data <div>ZZ&prod;_id=23</div> #errors #document | <html> | <head> | <body> | <div> | "ZZ∏_id=23" #data <div>ZZ&pound=23</div> #errors #document | <html> | <head> | <body> | <div> | "ZZ£=23" #data <div>ZZ&prod=23</div> #errors #document | <html> | <head> | <body> | <div> | "ZZ&prod=23" ��������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests17.dat�������������������������������������������������������������0000644�0001751�0001751�00000003721�12235217213�017373� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <!doctype html><table><tbody><select><tr> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | <table> | <tbody> | <tr> #data <!doctype html><table><tr><select><td> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | <table> | <tbody> | <tr> | <td> #data <!doctype html><table><tr><td><select><td> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <select> | <td> #data <!doctype html><table><tr><th><select><td> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | <th> | <select> | <td> #data <!doctype html><table><caption><select><tr> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <caption> | <select> | <tbody> | <tr> #data <!doctype html><select><tr> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> #data <!doctype html><select><td> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> #data <!doctype html><select><th> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> #data <!doctype html><select><tbody> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> #data <!doctype html><select><thead> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> #data <!doctype html><select><tfoot> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> #data <!doctype html><select><caption> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> #data <!doctype html><table><tr></table>a #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | "a" �����������������������������������������������go.net/html/testdata/webkit/pending-spec-changes-plain-text-unsafe.dat������������������������������0000644�0001751�0001751�00000000163�12235217213�025402� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <body><table>�filler�text� #errors #document | <html> | <head> | <body> | "fillertext" | <table> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests6.dat��������������������������������������������������������������0000644�0001751�0001751�00000035540�12235217213�017315� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <!doctype html></head> <head> #errors Line: 1 Col: 29 Unexpected start tag head. Ignored. #document | <!DOCTYPE html> | <html> | <head> | " " | <body> #data <!doctype html><form><div></form><div> #errors 33: End tag "form" seen but there were unclosed elements. 38: End of file seen and there were open elements. #document | <!DOCTYPE html> | <html> | <head> | <body> | <form> | <div> | <div> #data <!doctype html><title>&amp;</title> #errors #document | <!DOCTYPE html> | <html> | <head> | <title> | "&" | <body> #data <!doctype html><title><!--&amp;--></title> #errors #document | <!DOCTYPE html> | <html> | <head> | <title> | "<!--&-->" | <body> #data <!doctype> #errors Line: 1 Col: 9 No space after literal string 'DOCTYPE'. Line: 1 Col: 10 Unexpected > character. Expected DOCTYPE name. Line: 1 Col: 10 Erroneous DOCTYPE. #document | <!DOCTYPE > | <html> | <head> | <body> #data <!---x #errors Line: 1 Col: 6 Unexpected end of file in comment. Line: 1 Col: 6 Unexpected End of file. Expected DOCTYPE. #document | <!-- -x --> | <html> | <head> | <body> #data <body> <div> #errors Line: 1 Col: 6 Unexpected start tag (body). Line: 2 Col: 5 Expected closing tag. Unexpected end of file. #document-fragment div #document | " " | <div> #data <frameset></frameset> foo #errors Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. Line: 2 Col: 3 Unexpected non-space characters in the after frameset phase. Ignored. #document | <html> | <head> | <frameset> | " " #data <frameset></frameset> <noframes> #errors Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. Line: 2 Col: 10 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <frameset> | " " | <noframes> #data <frameset></frameset> <div> #errors Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. Line: 2 Col: 5 Unexpected start tag (div) in the after frameset phase. Ignored. #document | <html> | <head> | <frameset> | " " #data <frameset></frameset> </html> #errors Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. #document | <html> | <head> | <frameset> | " " #data <frameset></frameset> </div> #errors Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. Line: 2 Col: 6 Unexpected end tag (div) in the after frameset phase. Ignored. #document | <html> | <head> | <frameset> | " " #data <form><form> #errors Line: 1 Col: 6 Unexpected start tag (form). Expected DOCTYPE. Line: 1 Col: 12 Unexpected start tag (form). Line: 1 Col: 12 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <form> #data <button><button> #errors Line: 1 Col: 8 Unexpected start tag (button). Expected DOCTYPE. Line: 1 Col: 16 Unexpected start tag (button) implies end tag (button). Line: 1 Col: 16 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <button> | <button> #data <table><tr><td></th> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 20 Unexpected end tag (th). Ignored. Line: 1 Col: 20 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> #data <table><caption><td> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 20 Unexpected end tag (td). Ignored. Line: 1 Col: 20 Unexpected table cell start tag (td) in the table body phase. Line: 1 Col: 20 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <table> | <caption> | <tbody> | <tr> | <td> #data <table><caption><div> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 21 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <table> | <caption> | <div> #data </caption><div> #errors Line: 1 Col: 10 Unexpected end tag (caption). Ignored. Line: 1 Col: 15 Expected closing tag. Unexpected end of file. #document-fragment caption #document | <div> #data <table><caption><div></caption> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 31 Unexpected end tag (caption). Missing end tag (div). Line: 1 Col: 31 Unexpected end of file. Expected table content. #document | <html> | <head> | <body> | <table> | <caption> | <div> #data <table><caption></table> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 24 Unexpected end table tag in caption. Generates implied end caption. #document | <html> | <head> | <body> | <table> | <caption> #data </table><div> #errors Line: 1 Col: 8 Unexpected end table tag in caption. Generates implied end caption. Line: 1 Col: 8 Unexpected end tag (caption). Ignored. Line: 1 Col: 13 Expected closing tag. Unexpected end of file. #document-fragment caption #document | <div> #data <table><caption></body></col></colgroup></html></tbody></td></tfoot></th></thead></tr> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 23 Unexpected end tag (body). Ignored. Line: 1 Col: 29 Unexpected end tag (col). Ignored. Line: 1 Col: 40 Unexpected end tag (colgroup). Ignored. Line: 1 Col: 47 Unexpected end tag (html). Ignored. Line: 1 Col: 55 Unexpected end tag (tbody). Ignored. Line: 1 Col: 60 Unexpected end tag (td). Ignored. Line: 1 Col: 68 Unexpected end tag (tfoot). Ignored. Line: 1 Col: 73 Unexpected end tag (th). Ignored. Line: 1 Col: 81 Unexpected end tag (thead). Ignored. Line: 1 Col: 86 Unexpected end tag (tr). Ignored. Line: 1 Col: 86 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <table> | <caption> #data <table><caption><div></div> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 27 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <table> | <caption> | <div> #data <table><tr><td></body></caption></col></colgroup></html> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 22 Unexpected end tag (body). Ignored. Line: 1 Col: 32 Unexpected end tag (caption). Ignored. Line: 1 Col: 38 Unexpected end tag (col). Ignored. Line: 1 Col: 49 Unexpected end tag (colgroup). Ignored. Line: 1 Col: 56 Unexpected end tag (html). Ignored. Line: 1 Col: 56 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> #data </table></tbody></tfoot></thead></tr><div> #errors Line: 1 Col: 8 Unexpected end tag (table). Ignored. Line: 1 Col: 16 Unexpected end tag (tbody). Ignored. Line: 1 Col: 24 Unexpected end tag (tfoot). Ignored. Line: 1 Col: 32 Unexpected end tag (thead). Ignored. Line: 1 Col: 37 Unexpected end tag (tr). Ignored. Line: 1 Col: 42 Expected closing tag. Unexpected end of file. #document-fragment td #document | <div> #data <table><colgroup>foo #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 20 Unexpected non-space characters in table context caused voodoo mode. Line: 1 Col: 20 Unexpected end of file. Expected table content. #document | <html> | <head> | <body> | "foo" | <table> | <colgroup> #data foo<col> #errors Line: 1 Col: 3 Unexpected end tag (colgroup). Ignored. #document-fragment colgroup #document | <col> #data <table><colgroup></col> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 23 This element (col) has no end tag. Line: 1 Col: 23 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <table> | <colgroup> #data <frameset><div> #errors Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. Line: 1 Col: 15 Unexpected start tag token (div) in the frameset phase. Ignored. Line: 1 Col: 15 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <frameset> #data </frameset><frame> #errors Line: 1 Col: 11 Unexpected end tag token (frameset) in the frameset phase (innerHTML). #document-fragment frameset #document | <frame> #data <frameset></div> #errors Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. Line: 1 Col: 16 Unexpected end tag token (div) in the frameset phase. Ignored. Line: 1 Col: 16 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <frameset> #data </body><div> #errors Line: 1 Col: 7 Unexpected end tag (body). Ignored. Line: 1 Col: 12 Expected closing tag. Unexpected end of file. #document-fragment body #document | <div> #data <table><tr><div> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 16 Unexpected start tag (div) in table context caused voodoo mode. Line: 1 Col: 16 Unexpected end of file. Expected table content. #document | <html> | <head> | <body> | <div> | <table> | <tbody> | <tr> #data </tr><td> #errors Line: 1 Col: 5 Unexpected end tag (tr). Ignored. #document-fragment tr #document | <td> #data </tbody></tfoot></thead><td> #errors Line: 1 Col: 8 Unexpected end tag (tbody). Ignored. Line: 1 Col: 16 Unexpected end tag (tfoot). Ignored. Line: 1 Col: 24 Unexpected end tag (thead). Ignored. #document-fragment tr #document | <td> #data <table><tr><div><td> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 16 Unexpected start tag (div) in table context caused voodoo mode. Line: 1 Col: 20 Unexpected implied end tag (div) in the table row phase. Line: 1 Col: 20 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> | <table> | <tbody> | <tr> | <td> #data <caption><col><colgroup><tbody><tfoot><thead><tr> #errors Line: 1 Col: 9 Unexpected start tag (caption). Line: 1 Col: 14 Unexpected start tag (col). Line: 1 Col: 24 Unexpected start tag (colgroup). Line: 1 Col: 31 Unexpected start tag (tbody). Line: 1 Col: 38 Unexpected start tag (tfoot). Line: 1 Col: 45 Unexpected start tag (thead). Line: 1 Col: 49 Unexpected end of file. Expected table content. #document-fragment tbody #document | <tr> #data <table><tbody></thead> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 22 Unexpected end tag (thead) in the table body phase. Ignored. Line: 1 Col: 22 Unexpected end of file. Expected table content. #document | <html> | <head> | <body> | <table> | <tbody> #data </table><tr> #errors Line: 1 Col: 8 Unexpected end tag (table). Ignored. Line: 1 Col: 12 Unexpected end of file. Expected table content. #document-fragment tbody #document | <tr> #data <table><tbody></body></caption></col></colgroup></html></td></th></tr> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 21 Unexpected end tag (body) in the table body phase. Ignored. Line: 1 Col: 31 Unexpected end tag (caption) in the table body phase. Ignored. Line: 1 Col: 37 Unexpected end tag (col) in the table body phase. Ignored. Line: 1 Col: 48 Unexpected end tag (colgroup) in the table body phase. Ignored. Line: 1 Col: 55 Unexpected end tag (html) in the table body phase. Ignored. Line: 1 Col: 60 Unexpected end tag (td) in the table body phase. Ignored. Line: 1 Col: 65 Unexpected end tag (th) in the table body phase. Ignored. Line: 1 Col: 70 Unexpected end tag (tr) in the table body phase. Ignored. Line: 1 Col: 70 Unexpected end of file. Expected table content. #document | <html> | <head> | <body> | <table> | <tbody> #data <table><tbody></div> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 20 Unexpected end tag (div) in table context caused voodoo mode. Line: 1 Col: 20 End tag (div) seen too early. Expected other end tag. Line: 1 Col: 20 Unexpected end of file. Expected table content. #document | <html> | <head> | <body> | <table> | <tbody> #data <table><table> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 14 Unexpected start tag (table) implies end tag (table). Line: 1 Col: 14 Unexpected end of file. Expected table content. #document | <html> | <head> | <body> | <table> | <table> #data <table></body></caption></col></colgroup></html></tbody></td></tfoot></th></thead></tr> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 14 Unexpected end tag (body). Ignored. Line: 1 Col: 24 Unexpected end tag (caption). Ignored. Line: 1 Col: 30 Unexpected end tag (col). Ignored. Line: 1 Col: 41 Unexpected end tag (colgroup). Ignored. Line: 1 Col: 48 Unexpected end tag (html). Ignored. Line: 1 Col: 56 Unexpected end tag (tbody). Ignored. Line: 1 Col: 61 Unexpected end tag (td). Ignored. Line: 1 Col: 69 Unexpected end tag (tfoot). Ignored. Line: 1 Col: 74 Unexpected end tag (th). Ignored. Line: 1 Col: 82 Unexpected end tag (thead). Ignored. Line: 1 Col: 87 Unexpected end tag (tr). Ignored. Line: 1 Col: 87 Unexpected end of file. Expected table content. #document | <html> | <head> | <body> | <table> #data </table><tr> #errors Line: 1 Col: 8 Unexpected end tag (table). Ignored. Line: 1 Col: 12 Unexpected end of file. Expected table content. #document-fragment table #document | <tbody> | <tr> #data <body></body></html> #errors Line: 1 Col: 20 Unexpected html end tag in inner html mode. Line: 1 Col: 20 Unexpected EOF in inner html mode. #document-fragment html #document | <head> | <body> #data <html><frameset></frameset></html> #errors Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. #document | <html> | <head> | <frameset> | " " #data <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"><html></html> #errors Line: 1 Col: 50 Erroneous DOCTYPE. Line: 1 Col: 63 Unexpected end tag (html) after the (implied) root element. #document | <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" ""> | <html> | <head> | <body> #data <param><frameset></frameset> #errors Line: 1 Col: 7 Unexpected start tag (param). Expected DOCTYPE. Line: 1 Col: 17 Unexpected start tag (frameset). #document | <html> | <head> | <frameset> #data <source><frameset></frameset> #errors Line: 1 Col: 7 Unexpected start tag (source). Expected DOCTYPE. Line: 1 Col: 17 Unexpected start tag (frameset). #document | <html> | <head> | <frameset> #data <track><frameset></frameset> #errors Line: 1 Col: 7 Unexpected start tag (track). Expected DOCTYPE. Line: 1 Col: 17 Unexpected start tag (frameset). #document | <html> | <head> | <frameset> #data </html><frameset></frameset> #errors 7: End tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. 17: Stray “frameset” start tag. 17: “frameset” start tag seen. #document | <html> | <head> | <frameset> #data </body><frameset></frameset> #errors 7: End tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. 17: Stray “frameset” start tag. 17: “frameset” start tag seen. #document | <html> | <head> | <frameset> ����������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests18.dat�������������������������������������������������������������0000644�0001751�0001751�00000010056�12235217213�017373� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <!doctype html><plaintext></plaintext> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <plaintext> | "</plaintext>" #data <!doctype html><table><plaintext></plaintext> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <plaintext> | "</plaintext>" | <table> #data <!doctype html><table><tbody><plaintext></plaintext> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <plaintext> | "</plaintext>" | <table> | <tbody> #data <!doctype html><table><tbody><tr><plaintext></plaintext> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <plaintext> | "</plaintext>" | <table> | <tbody> | <tr> #data <!doctype html><table><tbody><tr><plaintext></plaintext> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <plaintext> | "</plaintext>" | <table> | <tbody> | <tr> #data <!doctype html><table><td><plaintext></plaintext> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <plaintext> | "</plaintext>" #data <!doctype html><table><caption><plaintext></plaintext> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <caption> | <plaintext> | "</plaintext>" #data <!doctype html><table><tr><style></script></style>abc #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | "abc" | <table> | <tbody> | <tr> | <style> | "</script>" #data <!doctype html><table><tr><script></style></script>abc #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | "abc" | <table> | <tbody> | <tr> | <script> | "</style>" #data <!doctype html><table><caption><style></script></style>abc #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <caption> | <style> | "</script>" | "abc" #data <!doctype html><table><td><style></script></style>abc #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <style> | "</script>" | "abc" #data <!doctype html><select><script></style></script>abc #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | <script> | "</style>" | "abc" #data <!doctype html><table><select><script></style></script>abc #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | <script> | "</style>" | "abc" | <table> #data <!doctype html><table><tr><select><script></style></script>abc #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | <script> | "</style>" | "abc" | <table> | <tbody> | <tr> #data <!doctype html><frameset></frameset><noframes>abc #errors #document | <!DOCTYPE html> | <html> | <head> | <frameset> | <noframes> | "abc" #data <!doctype html><frameset></frameset><noframes>abc</noframes><!--abc--> #errors #document | <!DOCTYPE html> | <html> | <head> | <frameset> | <noframes> | "abc" | <!-- abc --> #data <!doctype html><frameset></frameset></html><noframes>abc #errors #document | <!DOCTYPE html> | <html> | <head> | <frameset> | <noframes> | "abc" #data <!doctype html><frameset></frameset></html><noframes>abc</noframes><!--abc--> #errors #document | <!DOCTYPE html> | <html> | <head> | <frameset> | <noframes> | "abc" | <!-- abc --> #data <!doctype html><table><tr></tbody><tfoot> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | <tfoot> #data <!doctype html><table><td><svg></svg>abc<td> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <svg svg> | "abc" | <td> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/scripted/���������������������������������������������������������������0000755�0001751�0001751�00000000000�12235217213�017201� 5����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/scripted/adoption01.dat�������������������������������������������������0000644�0001751�0001751�00000000435�12235217213�021653� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <p><b id="A"><script>document.getElementById("A").id = "B"</script></p>TEXT</b> #errors #document | <html> | <head> | <body> | <p> | <b> | id="B" | <script> | "document.getElementById("A").id = "B"" | <b> | id="A" | "TEXT" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/scripted/webkit01.dat���������������������������������������������������0000644�0001751�0001751�00000001105�12235217213�021316� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data 1<script>document.write("2")</script>3 #errors #document | <html> | <head> | <body> | "1" | <script> | "document.write("2")" | "23" #data 1<script>document.write("<script>document.write('2')</scr"+ "ipt><script>document.write('3')</scr" + "ipt>")</script>4 #errors #document | <html> | <head> | <body> | "1" | <script> | "document.write("<script>document.write('2')</scr"+ "ipt><script>document.write('3')</scr" + "ipt>")" | <script> | "document.write('2')" | "2" | <script> | "document.write('3')" | "34" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/html5test-com.dat�������������������������������������������������������0000644�0001751�0001751�00000005162�12235217213�020567� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <div<div> #errors #document | <html> | <head> | <body> | <div<div> #data <div foo<bar=''> #errors #document | <html> | <head> | <body> | <div> | foo<bar="" #data <div foo=`bar`> #errors #document | <html> | <head> | <body> | <div> | foo="`bar`" #data <div \"foo=''> #errors #document | <html> | <head> | <body> | <div> | \"foo="" #data <a href='\nbar'></a> #errors #document | <html> | <head> | <body> | <a> | href="\nbar" #data <!DOCTYPE html> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> #data &lang;&rang; #errors #document | <html> | <head> | <body> | "⟨⟩" #data &apos; #errors #document | <html> | <head> | <body> | "'" #data &ImaginaryI; #errors #document | <html> | <head> | <body> | "ⅈ" #data &Kopf; #errors #document | <html> | <head> | <body> | "𝕂" #data &notinva; #errors #document | <html> | <head> | <body> | "∉" #data <?import namespace="foo" implementation="#bar"> #errors #document | <!-- ?import namespace="foo" implementation="#bar" --> | <html> | <head> | <body> #data <!--foo--bar--> #errors #document | <!-- foo--bar --> | <html> | <head> | <body> #data <![CDATA[x]]> #errors #document | <!-- [CDATA[x]] --> | <html> | <head> | <body> #data <textarea><!--</textarea>--></textarea> #errors #document | <html> | <head> | <body> | <textarea> | "<!--" | "-->" #data <textarea><!--</textarea>--> #errors #document | <html> | <head> | <body> | <textarea> | "<!--" | "-->" #data <style><!--</style>--></style> #errors #document | <html> | <head> | <style> | "<!--" | <body> | "-->" #data <style><!--</style>--> #errors #document | <html> | <head> | <style> | "<!--" | <body> | "-->" #data <ul><li>A </li> <li>B</li></ul> #errors #document | <html> | <head> | <body> | <ul> | <li> | "A " | " " | <li> | "B" #data <table><form><input type=hidden><input></form><div></div></table> #errors #document | <html> | <head> | <body> | <input> | <div> | <table> | <form> | <input> | type="hidden" #data <i>A<b>B<p></i>C</b>D #errors #document | <html> | <head> | <body> | <i> | "A" | <b> | "B" | <b> | <p> | <b> | <i> | "C" | "D" #data <div></div> #errors #document | <html> | <head> | <body> | <div> #data <svg></svg> #errors #document | <html> | <head> | <body> | <svg svg> #data <math></math> #errors #document | <html> | <head> | <body> | <math math> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests16.dat�������������������������������������������������������������0000644�0001751�0001751�00000125251�12235217213�017375� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <!doctype html><script> #errors Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | <body> #data <!doctype html><script>a #errors Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "a" | <body> #data <!doctype html><script>< #errors Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<" | <body> #data <!doctype html><script></ #errors Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "</" | <body> #data <!doctype html><script></S #errors Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "</S" | <body> #data <!doctype html><script></SC #errors Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "</SC" | <body> #data <!doctype html><script></SCR #errors Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "</SCR" | <body> #data <!doctype html><script></SCRI #errors Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "</SCRI" | <body> #data <!doctype html><script></SCRIP #errors Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "</SCRIP" | <body> #data <!doctype html><script></SCRIPT #errors Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "</SCRIPT" | <body> #data <!doctype html><script></SCRIPT #errors Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | <body> #data <!doctype html><script></s #errors Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "</s" | <body> #data <!doctype html><script></sc #errors Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "</sc" | <body> #data <!doctype html><script></scr #errors Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "</scr" | <body> #data <!doctype html><script></scri #errors Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "</scri" | <body> #data <!doctype html><script></scrip #errors Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "</scrip" | <body> #data <!doctype html><script></script #errors Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "</script" | <body> #data <!doctype html><script></script #errors Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | <body> #data <!doctype html><script><! #errors Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!" | <body> #data <!doctype html><script><!a #errors Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!a" | <body> #data <!doctype html><script><!- #errors Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!-" | <body> #data <!doctype html><script><!-a #errors Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!-a" | <body> #data <!doctype html><script><!-- #errors Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--" | <body> #data <!doctype html><script><!--a #errors Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--a" | <body> #data <!doctype html><script><!--< #errors Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<" | <body> #data <!doctype html><script><!--<a #errors Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<a" | <body> #data <!doctype html><script><!--</ #errors Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--</" | <body> #data <!doctype html><script><!--</script #errors Line: 1 Col: 35 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--</script" | <body> #data <!doctype html><script><!--</script #errors Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--" | <body> #data <!doctype html><script><!--<s #errors Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<s" | <body> #data <!doctype html><script><!--<script #errors Line: 1 Col: 34 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script" | <body> #data <!doctype html><script><!--<script #errors Line: 1 Col: 35 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script " | <body> #data <!doctype html><script><!--<script < #errors Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script <" | <body> #data <!doctype html><script><!--<script <a #errors Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script <a" | <body> #data <!doctype html><script><!--<script </ #errors Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script </" | <body> #data <!doctype html><script><!--<script </s #errors Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script </s" | <body> #data <!doctype html><script><!--<script </script #errors Line: 1 Col: 43 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script </script" | <body> #data <!doctype html><script><!--<script </scripta #errors Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script </scripta" | <body> #data <!doctype html><script><!--<script </script #errors Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script </script " | <body> #data <!doctype html><script><!--<script </script> #errors Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script </script>" | <body> #data <!doctype html><script><!--<script </script/ #errors Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script </script/" | <body> #data <!doctype html><script><!--<script </script < #errors Line: 1 Col: 45 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script </script <" | <body> #data <!doctype html><script><!--<script </script <a #errors Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script </script <a" | <body> #data <!doctype html><script><!--<script </script </ #errors Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script </script </" | <body> #data <!doctype html><script><!--<script </script </script #errors Line: 1 Col: 52 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script </script </script" | <body> #data <!doctype html><script><!--<script </script </script #errors Line: 1 Col: 53 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script </script " | <body> #data <!doctype html><script><!--<script </script </script/ #errors Line: 1 Col: 53 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script </script " | <body> #data <!doctype html><script><!--<script </script </script> #errors #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script </script " | <body> #data <!doctype html><script><!--<script - #errors Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script -" | <body> #data <!doctype html><script><!--<script -a #errors Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script -a" | <body> #data <!doctype html><script><!--<script -< #errors Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script -<" | <body> #data <!doctype html><script><!--<script -- #errors Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script --" | <body> #data <!doctype html><script><!--<script --a #errors Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script --a" | <body> #data <!doctype html><script><!--<script --< #errors Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script --<" | <body> #data <!doctype html><script><!--<script --> #errors Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script -->" | <body> #data <!doctype html><script><!--<script -->< #errors Line: 1 Col: 39 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script --><" | <body> #data <!doctype html><script><!--<script --></ #errors Line: 1 Col: 40 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script --></" | <body> #data <!doctype html><script><!--<script --></script #errors Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script --></script" | <body> #data <!doctype html><script><!--<script --></script #errors Line: 1 Col: 47 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script -->" | <body> #data <!doctype html><script><!--<script --></script/ #errors Line: 1 Col: 47 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script -->" | <body> #data <!doctype html><script><!--<script --></script> #errors #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script -->" | <body> #data <!doctype html><script><!--<script><\/script>--></script> #errors #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script><\/script>-->" | <body> #data <!doctype html><script><!--<script></scr'+'ipt>--></script> #errors #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script></scr'+'ipt>-->" | <body> #data <!doctype html><script><!--<script></script><script></script></script> #errors #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script></script><script></script>" | <body> #data <!doctype html><script><!--<script></script><script></script>--><!--</script> #errors #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script></script><script></script>--><!--" | <body> #data <!doctype html><script><!--<script></script><script></script>-- ></script> #errors #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script></script><script></script>-- >" | <body> #data <!doctype html><script><!--<script></script><script></script>- -></script> #errors #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script></script><script></script>- ->" | <body> #data <!doctype html><script><!--<script></script><script></script>- - ></script> #errors #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script></script><script></script>- - >" | <body> #data <!doctype html><script><!--<script></script><script></script>-></script> #errors #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script></script><script></script>->" | <body> #data <!doctype html><script><!--<script>--!></script>X #errors Line: 1 Col: 49 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script>--!></script>X" | <body> #data <!doctype html><script><!--<scr'+'ipt></script>--></script> #errors Line: 1 Col: 59 Unexpected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<scr'+'ipt>" | <body> | "-->" #data <!doctype html><script><!--<script></scr'+'ipt></script>X #errors Line: 1 Col: 57 Unexpected end of file. Expected end tag (script). #document | <!DOCTYPE html> | <html> | <head> | <script> | "<!--<script></scr'+'ipt></script>X" | <body> #data <!doctype html><style><!--<style></style>--></style> #errors Line: 1 Col: 52 Unexpected end tag (style). #document | <!DOCTYPE html> | <html> | <head> | <style> | "<!--<style>" | <body> | "-->" #data <!doctype html><style><!--</style>X #errors #document | <!DOCTYPE html> | <html> | <head> | <style> | "<!--" | <body> | "X" #data <!doctype html><style><!--...</style>...--></style> #errors Line: 1 Col: 51 Unexpected end tag (style). #document | <!DOCTYPE html> | <html> | <head> | <style> | "<!--..." | <body> | "...-->" #data <!doctype html><style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X #errors #document | <!DOCTYPE html> | <html> | <head> | <style> | "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" | <body> | "X" #data <!doctype html><style><!--...<style><!--...--!></style>--></style> #errors Line: 1 Col: 66 Unexpected end tag (style). #document | <!DOCTYPE html> | <html> | <head> | <style> | "<!--...<style><!--...--!>" | <body> | "-->" #data <!doctype html><style><!--...</style><!-- --><style>@import ...</style> #errors #document | <!DOCTYPE html> | <html> | <head> | <style> | "<!--..." | <!-- --> | <style> | "@import ..." | <body> #data <!doctype html><style>...<style><!--...</style><!-- --></style> #errors Line: 1 Col: 63 Unexpected end tag (style). #document | <!DOCTYPE html> | <html> | <head> | <style> | "...<style><!--..." | <!-- --> | <body> #data <!doctype html><style>...<!--[if IE]><style>...</style>X #errors #document | <!DOCTYPE html> | <html> | <head> | <style> | "...<!--[if IE]><style>..." | <body> | "X" #data <!doctype html><title><!--<title></title>--></title> #errors Line: 1 Col: 52 Unexpected end tag (title). #document | <!DOCTYPE html> | <html> | <head> | <title> | "<!--<title>" | <body> | "-->" #data <!doctype html><title>&lt;/title></title> #errors #document | <!DOCTYPE html> | <html> | <head> | <title> | "</title>" | <body> #data <!doctype html><title>foo/title><link></head><body>X #errors Line: 1 Col: 52 Unexpected end of file. Expected end tag (title). #document | <!DOCTYPE html> | <html> | <head> | <title> | "foo/title><link></head><body>X" | <body> #data <!doctype html><noscript><!--<noscript></noscript>--></noscript> #errors Line: 1 Col: 64 Unexpected end tag (noscript). #document | <!DOCTYPE html> | <html> | <head> | <noscript> | "<!--<noscript>" | <body> | "-->" #data <!doctype html><noscript><!--</noscript>X<noscript>--></noscript> #errors #document | <!DOCTYPE html> | <html> | <head> | <noscript> | "<!--" | <body> | "X" | <noscript> | "-->" #data <!doctype html><noscript><iframe></noscript>X #errors #document | <!DOCTYPE html> | <html> | <head> | <noscript> | "<iframe>" | <body> | "X" #data <!doctype html><noframes><!--<noframes></noframes>--></noframes> #errors Line: 1 Col: 64 Unexpected end tag (noframes). #document | <!DOCTYPE html> | <html> | <head> | <noframes> | "<!--<noframes>" | <body> | "-->" #data <!doctype html><noframes><body><script><!--...</script></body></noframes></html> #errors #document | <!DOCTYPE html> | <html> | <head> | <noframes> | "<body><script><!--...</script></body>" | <body> #data <!doctype html><textarea><!--<textarea></textarea>--></textarea> #errors Line: 1 Col: 64 Unexpected end tag (textarea). #document | <!DOCTYPE html> | <html> | <head> | <body> | <textarea> | "<!--<textarea>" | "-->" #data <!doctype html><textarea>&lt;/textarea></textarea> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <textarea> | "</textarea>" #data <!doctype html><textarea>&lt;</textarea> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <textarea> | "<" #data <!doctype html><textarea>a&lt;b</textarea> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <textarea> | "a<b" #data <!doctype html><iframe><!--<iframe></iframe>--></iframe> #errors Line: 1 Col: 56 Unexpected end tag (iframe). #document | <!DOCTYPE html> | <html> | <head> | <body> | <iframe> | "<!--<iframe>" | "-->" #data <!doctype html><iframe>...<!--X->...<!--/X->...</iframe> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <iframe> | "...<!--X->...<!--/X->..." #data <!doctype html><xmp><!--<xmp></xmp>--></xmp> #errors Line: 1 Col: 44 Unexpected end tag (xmp). #document | <!DOCTYPE html> | <html> | <head> | <body> | <xmp> | "<!--<xmp>" | "-->" #data <!doctype html><noembed><!--<noembed></noembed>--></noembed> #errors Line: 1 Col: 60 Unexpected end tag (noembed). #document | <!DOCTYPE html> | <html> | <head> | <body> | <noembed> | "<!--<noembed>" | "-->" #data <script> #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 8 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | <body> #data <script>a #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 9 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "a" | <body> #data <script>< #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 9 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<" | <body> #data <script></ #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 10 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "</" | <body> #data <script></S #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "</S" | <body> #data <script></SC #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "</SC" | <body> #data <script></SCR #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "</SCR" | <body> #data <script></SCRI #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "</SCRI" | <body> #data <script></SCRIP #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 15 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "</SCRIP" | <body> #data <script></SCRIPT #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 16 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "</SCRIPT" | <body> #data <script></SCRIPT #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 17 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | <body> #data <script></s #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "</s" | <body> #data <script></sc #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "</sc" | <body> #data <script></scr #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "</scr" | <body> #data <script></scri #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "</scri" | <body> #data <script></scrip #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 15 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "</scrip" | <body> #data <script></script #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 16 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "</script" | <body> #data <script></script #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 17 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | <body> #data <script><! #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 10 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!" | <body> #data <script><!a #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!a" | <body> #data <script><!- #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!-" | <body> #data <script><!-a #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!-a" | <body> #data <script><!-- #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--" | <body> #data <script><!--a #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--a" | <body> #data <script><!--< #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<" | <body> #data <script><!--<a #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<a" | <body> #data <script><!--</ #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--</" | <body> #data <script><!--</script #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 20 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--</script" | <body> #data <script><!--</script #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--" | <body> #data <script><!--<s #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<s" | <body> #data <script><!--<script #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 19 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script" | <body> #data <script><!--<script #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 20 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script " | <body> #data <script><!--<script < #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script <" | <body> #data <script><!--<script <a #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script <a" | <body> #data <script><!--<script </ #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script </" | <body> #data <script><!--<script </s #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script </s" | <body> #data <script><!--<script </script #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script </script" | <body> #data <script><!--<script </scripta #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script </scripta" | <body> #data <script><!--<script </script #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script </script " | <body> #data <script><!--<script </script> #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script </script>" | <body> #data <script><!--<script </script/ #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script </script/" | <body> #data <script><!--<script </script < #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script </script <" | <body> #data <script><!--<script </script <a #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script </script <a" | <body> #data <script><!--<script </script </ #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script </script </" | <body> #data <script><!--<script </script </script #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script </script </script" | <body> #data <script><!--<script </script </script #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script </script " | <body> #data <script><!--<script </script </script/ #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script </script " | <body> #data <script><!--<script </script </script> #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. #document | <html> | <head> | <script> | "<!--<script </script " | <body> #data <script><!--<script - #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script -" | <body> #data <script><!--<script -a #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script -a" | <body> #data <script><!--<script -- #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script --" | <body> #data <script><!--<script --a #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script --a" | <body> #data <script><!--<script --> #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script -->" | <body> #data <script><!--<script -->< #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script --><" | <body> #data <script><!--<script --></ #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script --></" | <body> #data <script><!--<script --></script #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script --></script" | <body> #data <script><!--<script --></script #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script -->" | <body> #data <script><!--<script --></script/ #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script -->" | <body> #data <script><!--<script --></script> #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. #document | <html> | <head> | <script> | "<!--<script -->" | <body> #data <script><!--<script><\/script>--></script> #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. #document | <html> | <head> | <script> | "<!--<script><\/script>-->" | <body> #data <script><!--<script></scr'+'ipt>--></script> #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. #document | <html> | <head> | <script> | "<!--<script></scr'+'ipt>-->" | <body> #data <script><!--<script></script><script></script></script> #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. #document | <html> | <head> | <script> | "<!--<script></script><script></script>" | <body> #data <script><!--<script></script><script></script>--><!--</script> #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. #document | <html> | <head> | <script> | "<!--<script></script><script></script>--><!--" | <body> #data <script><!--<script></script><script></script>-- ></script> #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. #document | <html> | <head> | <script> | "<!--<script></script><script></script>-- >" | <body> #data <script><!--<script></script><script></script>- -></script> #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. #document | <html> | <head> | <script> | "<!--<script></script><script></script>- ->" | <body> #data <script><!--<script></script><script></script>- - ></script> #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. #document | <html> | <head> | <script> | "<!--<script></script><script></script>- - >" | <body> #data <script><!--<script></script><script></script>-></script> #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. #document | <html> | <head> | <script> | "<!--<script></script><script></script>->" | <body> #data <script><!--<script>--!></script>X #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 34 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script>--!></script>X" | <body> #data <script><!--<scr'+'ipt></script>--></script> #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 44 Unexpected end tag (script). #document | <html> | <head> | <script> | "<!--<scr'+'ipt>" | <body> | "-->" #data <script><!--<script></scr'+'ipt></script>X #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 42 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "<!--<script></scr'+'ipt></script>X" | <body> #data <style><!--<style></style>--></style> #errors Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. Line: 1 Col: 37 Unexpected end tag (style). #document | <html> | <head> | <style> | "<!--<style>" | <body> | "-->" #data <style><!--</style>X #errors Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. #document | <html> | <head> | <style> | "<!--" | <body> | "X" #data <style><!--...</style>...--></style> #errors Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. Line: 1 Col: 36 Unexpected end tag (style). #document | <html> | <head> | <style> | "<!--..." | <body> | "...-->" #data <style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X #errors Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. #document | <html> | <head> | <style> | "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" | <body> | "X" #data <style><!--...<style><!--...--!></style>--></style> #errors Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. Line: 1 Col: 51 Unexpected end tag (style). #document | <html> | <head> | <style> | "<!--...<style><!--...--!>" | <body> | "-->" #data <style><!--...</style><!-- --><style>@import ...</style> #errors Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. #document | <html> | <head> | <style> | "<!--..." | <!-- --> | <style> | "@import ..." | <body> #data <style>...<style><!--...</style><!-- --></style> #errors Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. Line: 1 Col: 48 Unexpected end tag (style). #document | <html> | <head> | <style> | "...<style><!--..." | <!-- --> | <body> #data <style>...<!--[if IE]><style>...</style>X #errors Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. #document | <html> | <head> | <style> | "...<!--[if IE]><style>..." | <body> | "X" #data <title><!--<title></title>--></title> #errors Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. Line: 1 Col: 37 Unexpected end tag (title). #document | <html> | <head> | <title> | "<!--<title>" | <body> | "-->" #data <title>&lt;/title></title> #errors Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. #document | <html> | <head> | <title> | "</title>" | <body> #data <title>foo/title><link></head><body>X #errors Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. Line: 1 Col: 37 Unexpected end of file. Expected end tag (title). #document | <html> | <head> | <title> | "foo/title><link></head><body>X" | <body> #data <noscript><!--<noscript></noscript>--></noscript> #errors Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. Line: 1 Col: 49 Unexpected end tag (noscript). #document | <html> | <head> | <noscript> | "<!--<noscript>" | <body> | "-->" #data <noscript><!--</noscript>X<noscript>--></noscript> #errors Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. #document | <html> | <head> | <noscript> | "<!--" | <body> | "X" | <noscript> | "-->" #data <noscript><iframe></noscript>X #errors Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. #document | <html> | <head> | <noscript> | "<iframe>" | <body> | "X" #data <noframes><!--<noframes></noframes>--></noframes> #errors Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE. Line: 1 Col: 49 Unexpected end tag (noframes). #document | <html> | <head> | <noframes> | "<!--<noframes>" | <body> | "-->" #data <noframes><body><script><!--...</script></body></noframes></html> #errors Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE. #document | <html> | <head> | <noframes> | "<body><script><!--...</script></body>" | <body> #data <textarea><!--<textarea></textarea>--></textarea> #errors Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. Line: 1 Col: 49 Unexpected end tag (textarea). #document | <html> | <head> | <body> | <textarea> | "<!--<textarea>" | "-->" #data <textarea>&lt;/textarea></textarea> #errors Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. #document | <html> | <head> | <body> | <textarea> | "</textarea>" #data <iframe><!--<iframe></iframe>--></iframe> #errors Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. Line: 1 Col: 41 Unexpected end tag (iframe). #document | <html> | <head> | <body> | <iframe> | "<!--<iframe>" | "-->" #data <iframe>...<!--X->...<!--/X->...</iframe> #errors Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. #document | <html> | <head> | <body> | <iframe> | "...<!--X->...<!--/X->..." #data <xmp><!--<xmp></xmp>--></xmp> #errors Line: 1 Col: 5 Unexpected start tag (xmp). Expected DOCTYPE. Line: 1 Col: 29 Unexpected end tag (xmp). #document | <html> | <head> | <body> | <xmp> | "<!--<xmp>" | "-->" #data <noembed><!--<noembed></noembed>--></noembed> #errors Line: 1 Col: 9 Unexpected start tag (noembed). Expected DOCTYPE. Line: 1 Col: 45 Unexpected end tag (noembed). #document | <html> | <head> | <body> | <noembed> | "<!--<noembed>" | "-->" #data <!doctype html><table> #errors Line 2 Col 0 Unexpected end of file. Expected table content. #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | " " #data <!doctype html><table><td><span><font></span><span> #errors Line 1 Col 26 Unexpected table cell start tag (td) in the table body phase. Line 1 Col 45 Unexpected end tag (span). Line 1 Col 51 Expected closing tag. Unexpected end of file. #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <span> | <font> | <font> | <span> #data <!doctype html><form><table></form><form></table></form> #errors 35: Stray end tag “form”. 41: Start tag “form” seen in “table”. #document | <!DOCTYPE html> | <html> | <head> | <body> | <form> | <table> | <form> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests14.dat�������������������������������������������������������������0000644�0001751�0001751�00000002045�12235217213�017366� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <!DOCTYPE html><html><body><xyz:abc></xyz:abc> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <xyz:abc> #data <!DOCTYPE html><html><body><xyz:abc></xyz:abc><span></span> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <xyz:abc> | <span> #data <!DOCTYPE html><html><html abc:def=gh><xyz:abc></xyz:abc> #errors 15: Unexpected start tag html #document | <!DOCTYPE html> | <html> | abc:def="gh" | <head> | <body> | <xyz:abc> #data <!DOCTYPE html><html xml:lang=bar><html xml:lang=foo> #errors 15: Unexpected start tag html #document | <!DOCTYPE html> | <html> | xml:lang="bar" | <head> | <body> #data <!DOCTYPE html><html 123=456> #errors #document | <!DOCTYPE html> | <html> | 123="456" | <head> | <body> #data <!DOCTYPE html><html 123=456><html 789=012> #errors #document | <!DOCTYPE html> | <html> | 123="456" | 789="012" | <head> | <body> #data <!DOCTYPE html><html><body 789=012> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | 789="012" �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/scriptdata01.dat��������������������������������������������������������0000644�0001751�0001751�00000010301�12235217213�020350� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data FOO<script>'Hello'</script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | "'Hello'" | "BAR" #data FOO<script></script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | "BAR" #data FOO<script></script >BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | "BAR" #data FOO<script></script/>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | "BAR" #data FOO<script></script/ >BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | "BAR" #data FOO<script type="text/plain"></scriptx>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | type="text/plain" | "</scriptx>BAR" #data FOO<script></script foo=">" dd>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | "BAR" #data FOO<script>'<'</script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | "'<'" | "BAR" #data FOO<script>'<!'</script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | "'<!'" | "BAR" #data FOO<script>'<!-'</script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | "'<!-'" | "BAR" #data FOO<script>'<!--'</script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | "'<!--'" | "BAR" #data FOO<script>'<!---'</script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | "'<!---'" | "BAR" #data FOO<script>'<!-->'</script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | "'<!-->'" | "BAR" #data FOO<script>'<!-->'</script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | "'<!-->'" | "BAR" #data FOO<script>'<!-- potato'</script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | "'<!-- potato'" | "BAR" #data FOO<script>'<!-- <sCrIpt'</script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | "'<!-- <sCrIpt'" | "BAR" #data FOO<script type="text/plain">'<!-- <sCrIpt>'</script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | type="text/plain" | "'<!-- <sCrIpt>'</script>BAR" #data FOO<script type="text/plain">'<!-- <sCrIpt> -'</script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | type="text/plain" | "'<!-- <sCrIpt> -'</script>BAR" #data FOO<script type="text/plain">'<!-- <sCrIpt> --'</script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | type="text/plain" | "'<!-- <sCrIpt> --'</script>BAR" #data FOO<script>'<!-- <sCrIpt> -->'</script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | "'<!-- <sCrIpt> -->'" | "BAR" #data FOO<script type="text/plain">'<!-- <sCrIpt> --!>'</script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | type="text/plain" | "'<!-- <sCrIpt> --!>'</script>BAR" #data FOO<script type="text/plain">'<!-- <sCrIpt> -- >'</script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | type="text/plain" | "'<!-- <sCrIpt> -- >'</script>BAR" #data FOO<script type="text/plain">'<!-- <sCrIpt '</script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | type="text/plain" | "'<!-- <sCrIpt '</script>BAR" #data FOO<script type="text/plain">'<!-- <sCrIpt/'</script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | type="text/plain" | "'<!-- <sCrIpt/'</script>BAR" #data FOO<script type="text/plain">'<!-- <sCrIpt\'</script>BAR #errors #document | <html> | <head> | <body> | "FOO" | <script> | type="text/plain" | "'<!-- <sCrIpt\'" | "BAR" #data FOO<script type="text/plain">'<!-- <sCrIpt/'</script>BAR</script>QUX #errors #document | <html> | <head> | <body> | "FOO" | <script> | type="text/plain" | "'<!-- <sCrIpt/'</script>BAR" | "QUX" �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests21.dat�������������������������������������������������������������0000644�0001751�0001751�00000004731�12235217213�017370� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <svg><![CDATA[foo]]> #errors #document | <html> | <head> | <body> | <svg svg> | "foo" #data <math><![CDATA[foo]]> #errors #document | <html> | <head> | <body> | <math math> | "foo" #data <div><![CDATA[foo]]> #errors #document | <html> | <head> | <body> | <div> | <!-- [CDATA[foo]] --> #data <svg><![CDATA[foo #errors #document | <html> | <head> | <body> | <svg svg> | "foo" #data <svg><![CDATA[foo #errors #document | <html> | <head> | <body> | <svg svg> | "foo" #data <svg><![CDATA[ #errors #document | <html> | <head> | <body> | <svg svg> #data <svg><![CDATA[]]> #errors #document | <html> | <head> | <body> | <svg svg> #data <svg><![CDATA[]] >]]> #errors #document | <html> | <head> | <body> | <svg svg> | "]] >" #data <svg><![CDATA[]] >]]> #errors #document | <html> | <head> | <body> | <svg svg> | "]] >" #data <svg><![CDATA[]] #errors #document | <html> | <head> | <body> | <svg svg> | "]]" #data <svg><![CDATA[] #errors #document | <html> | <head> | <body> | <svg svg> | "]" #data <svg><![CDATA[]>a #errors #document | <html> | <head> | <body> | <svg svg> | "]>a" #data <svg><foreignObject><div><![CDATA[foo]]> #errors #document | <html> | <head> | <body> | <svg svg> | <svg foreignObject> | <div> | <!-- [CDATA[foo]] --> #data <svg><![CDATA[<svg>]]> #errors #document | <html> | <head> | <body> | <svg svg> | "<svg>" #data <svg><![CDATA[</svg>a]]> #errors #document | <html> | <head> | <body> | <svg svg> | "</svg>a" #data <svg><![CDATA[<svg>a #errors #document | <html> | <head> | <body> | <svg svg> | "<svg>a" #data <svg><![CDATA[</svg>a #errors #document | <html> | <head> | <body> | <svg svg> | "</svg>a" #data <svg><![CDATA[<svg>]]><path> #errors #document | <html> | <head> | <body> | <svg svg> | "<svg>" | <svg path> #data <svg><![CDATA[<svg>]]></path> #errors #document | <html> | <head> | <body> | <svg svg> | "<svg>" #data <svg><![CDATA[<svg>]]><!--path--> #errors #document | <html> | <head> | <body> | <svg svg> | "<svg>" | <!-- path --> #data <svg><![CDATA[<svg>]]>path #errors #document | <html> | <head> | <body> | <svg svg> | "<svg>path" #data <svg><![CDATA[<!--svg-->]]> #errors #document | <html> | <head> | <body> | <svg svg> | "<!--svg-->" ���������������������������������������go.net/html/testdata/webkit/tests2.dat��������������������������������������������������������������0000644�0001751�0001751�00000032313�12235217213�017304� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <!DOCTYPE html>Test #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | "Test" #data <textarea>test</div>test #errors Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. Line: 1 Col: 24 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <textarea> | "test</div>test" #data <table><td> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. Line: 1 Col: 11 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> #data <table><td>test</tbody></table> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | "test" #data <frame>test #errors Line: 1 Col: 7 Unexpected start tag (frame). Expected DOCTYPE. Line: 1 Col: 7 Unexpected start tag frame. Ignored. #document | <html> | <head> | <body> | "test" #data <!DOCTYPE html><frameset>test #errors Line: 1 Col: 29 Unepxected characters in the frameset phase. Characters ignored. Line: 1 Col: 29 Expected closing tag. Unexpected end of file. #document | <!DOCTYPE html> | <html> | <head> | <frameset> #data <!DOCTYPE html><frameset><!DOCTYPE html> #errors Line: 1 Col: 40 Unexpected DOCTYPE. Ignored. Line: 1 Col: 40 Expected closing tag. Unexpected end of file. #document | <!DOCTYPE html> | <html> | <head> | <frameset> #data <!DOCTYPE html><font><p><b>test</font> #errors Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. #document | <!DOCTYPE html> | <html> | <head> | <body> | <font> | <p> | <font> | <b> | "test" #data <!DOCTYPE html><dt><div><dd> #errors Line: 1 Col: 28 Missing end tag (div, dt). #document | <!DOCTYPE html> | <html> | <head> | <body> | <dt> | <div> | <dd> #data <script></x #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). #document | <html> | <head> | <script> | "</x" | <body> #data <table><plaintext><td> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 18 Unexpected start tag (plaintext) in table context caused voodoo mode. Line: 1 Col: 22 Unexpected end of file. Expected table content. #document | <html> | <head> | <body> | <plaintext> | "<td>" | <table> #data <plaintext></plaintext> #errors Line: 1 Col: 11 Unexpected start tag (plaintext). Expected DOCTYPE. Line: 1 Col: 23 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <plaintext> | "</plaintext>" #data <!DOCTYPE html><table><tr>TEST #errors Line: 1 Col: 30 Unexpected non-space characters in table context caused voodoo mode. Line: 1 Col: 30 Unexpected end of file. Expected table content. #document | <!DOCTYPE html> | <html> | <head> | <body> | "TEST" | <table> | <tbody> | <tr> #data <!DOCTYPE html><body t1=1><body t2=2><body t3=3 t4=4> #errors Line: 1 Col: 37 Unexpected start tag (body). Line: 1 Col: 53 Unexpected start tag (body). #document | <!DOCTYPE html> | <html> | <head> | <body> | t1="1" | t2="2" | t3="3" | t4="4" #data </b test #errors Line: 1 Col: 8 Unexpected end of file in attribute name. Line: 1 Col: 8 End tag contains unexpected attributes. Line: 1 Col: 8 Unexpected end tag (b). Expected DOCTYPE. Line: 1 Col: 8 Unexpected end tag (b) after the (implied) root element. #document | <html> | <head> | <body> #data <!DOCTYPE html></b test<b &=&amp>X #errors Line: 1 Col: 32 Named entity didn't end with ';'. Line: 1 Col: 33 End tag contains unexpected attributes. Line: 1 Col: 33 Unexpected end tag (b) after the (implied) root element. #document | <!DOCTYPE html> | <html> | <head> | <body> | "X" #data <!doctypehtml><scrIPt type=text/x-foobar;baz>X</SCRipt #errors Line: 1 Col: 9 No space after literal string 'DOCTYPE'. Line: 1 Col: 54 Unexpected end of file in the tag name. #document | <!DOCTYPE html> | <html> | <head> | <script> | type="text/x-foobar;baz" | "X</SCRipt" | <body> #data & #errors Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. #document | <html> | <head> | <body> | "&" #data &# #errors Line: 1 Col: 1 Numeric entity expected. Got end of file instead. Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. #document | <html> | <head> | <body> | "&#" #data &#X #errors Line: 1 Col: 3 Numeric entity expected but none found. Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. #document | <html> | <head> | <body> | "&#X" #data &#x #errors Line: 1 Col: 3 Numeric entity expected but none found. Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. #document | <html> | <head> | <body> | "&#x" #data &#45 #errors Line: 1 Col: 4 Numeric entity didn't end with ';'. Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. #document | <html> | <head> | <body> | "-" #data &x-test #errors Line: 1 Col: 1 Named entity expected. Got none. Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. #document | <html> | <head> | <body> | "&x-test" #data <!doctypehtml><p><li> #errors Line: 1 Col: 9 No space after literal string 'DOCTYPE'. #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <li> #data <!doctypehtml><p><dt> #errors Line: 1 Col: 9 No space after literal string 'DOCTYPE'. #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <dt> #data <!doctypehtml><p><dd> #errors Line: 1 Col: 9 No space after literal string 'DOCTYPE'. #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <dd> #data <!doctypehtml><p><form> #errors Line: 1 Col: 9 No space after literal string 'DOCTYPE'. Line: 1 Col: 23 Expected closing tag. Unexpected end of file. #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <form> #data <!DOCTYPE html><p></P>X #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | "X" #data &AMP #errors Line: 1 Col: 4 Named entity didn't end with ';'. Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. #document | <html> | <head> | <body> | "&" #data &AMp; #errors Line: 1 Col: 1 Named entity expected. Got none. Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. #document | <html> | <head> | <body> | "&AMp;" #data <!DOCTYPE html><html><head></head><body><thisISasillyTESTelementNameToMakeSureCrazyTagNamesArePARSEDcorrectLY> #errors Line: 1 Col: 110 Expected closing tag. Unexpected end of file. #document | <!DOCTYPE html> | <html> | <head> | <body> | <thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly> #data <!DOCTYPE html>X</body>X #errors Line: 1 Col: 24 Unexpected non-space characters in the after body phase. #document | <!DOCTYPE html> | <html> | <head> | <body> | "XX" #data <!DOCTYPE html><!-- X #errors Line: 1 Col: 21 Unexpected end of file in comment. #document | <!DOCTYPE html> | <!-- X --> | <html> | <head> | <body> #data <!DOCTYPE html><table><caption>test TEST</caption><td>test #errors Line: 1 Col: 54 Unexpected table cell start tag (td) in the table body phase. Line: 1 Col: 58 Expected closing tag. Unexpected end of file. #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <caption> | "test TEST" | <tbody> | <tr> | <td> | "test" #data <!DOCTYPE html><select><option><optgroup> #errors Line: 1 Col: 41 Expected closing tag. Unexpected end of file. #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | <option> | <optgroup> #data <!DOCTYPE html><select><optgroup><option></optgroup><option><select><option> #errors Line: 1 Col: 68 Unexpected select start tag in the select phase treated as select end tag. Line: 1 Col: 76 Expected closing tag. Unexpected end of file. #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | <optgroup> | <option> | <option> | <option> #data <!DOCTYPE html><select><optgroup><option><optgroup> #errors Line: 1 Col: 51 Expected closing tag. Unexpected end of file. #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | <optgroup> | <option> | <optgroup> #data <!DOCTYPE html><datalist><option>foo</datalist>bar #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <datalist> | <option> | "foo" | "bar" #data <!DOCTYPE html><font><input><input></font> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <font> | <input> | <input> #data <!DOCTYPE html><!-- XXX - XXX --> #errors #document | <!DOCTYPE html> | <!-- XXX - XXX --> | <html> | <head> | <body> #data <!DOCTYPE html><!-- XXX - XXX #errors Line: 1 Col: 29 Unexpected end of file in comment (-) #document | <!DOCTYPE html> | <!-- XXX - XXX --> | <html> | <head> | <body> #data <!DOCTYPE html><!-- XXX - XXX - XXX --> #errors #document | <!DOCTYPE html> | <!-- XXX - XXX - XXX --> | <html> | <head> | <body> #data <isindex test=x name=x> #errors Line: 1 Col: 23 Unexpected start tag (isindex). Expected DOCTYPE. Line: 1 Col: 23 Unexpected start tag isindex. Don't use it! #document | <html> | <head> | <body> | <form> | <hr> | <label> | "This is a searchable index. Enter search keywords: " | <input> | name="isindex" | test="x" | <hr> #data test test #errors Line: 2 Col: 4 Unexpected non-space characters. Expected DOCTYPE. #document | <html> | <head> | <body> | "test test" #data <!DOCTYPE html><body><title>test</body></title> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <title> | "test</body>" #data <!DOCTYPE html><body><title>X</title><meta name=z><link rel=foo><style> x { content:"</style" } </style> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <title> | "X" | <meta> | name="z" | <link> | rel="foo" | <style> | " x { content:"</style" } " #data <!DOCTYPE html><select><optgroup></optgroup></select> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | <optgroup> #data #errors Line: 2 Col: 1 Unexpected End of file. Expected DOCTYPE. #document | <html> | <head> | <body> #data <!DOCTYPE html> <html> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> #data <!DOCTYPE html><script> </script> <title>x</title> </head> #errors #document | <!DOCTYPE html> | <html> | <head> | <script> | " " | " " | <title> | "x" | " " | <body> #data <!DOCTYPE html><html><body><html id=x> #errors Line: 1 Col: 38 html needs to be the first start tag. #document | <!DOCTYPE html> | <html> | id="x" | <head> | <body> #data <!DOCTYPE html>X</body><html id="x"> #errors Line: 1 Col: 36 Unexpected start tag token (html) in the after body phase. Line: 1 Col: 36 html needs to be the first start tag. #document | <!DOCTYPE html> | <html> | id="x" | <head> | <body> | "X" #data <!DOCTYPE html><head><html id=x> #errors Line: 1 Col: 32 html needs to be the first start tag. #document | <!DOCTYPE html> | <html> | id="x" | <head> | <body> #data <!DOCTYPE html>X</html>X #errors Line: 1 Col: 24 Unexpected non-space characters in the after body phase. #document | <!DOCTYPE html> | <html> | <head> | <body> | "XX" #data <!DOCTYPE html>X</html> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | "X " #data <!DOCTYPE html>X</html><p>X #errors Line: 1 Col: 26 Unexpected start tag (p). #document | <!DOCTYPE html> | <html> | <head> | <body> | "X" | <p> | "X" #data <!DOCTYPE html>X<p/x/y/z> #errors Line: 1 Col: 19 Expected a > after the /. Line: 1 Col: 21 Solidus (/) incorrectly placed in tag. Line: 1 Col: 23 Solidus (/) incorrectly placed in tag. #document | <!DOCTYPE html> | <html> | <head> | <body> | "X" | <p> | x="" | y="" | z="" #data <!DOCTYPE html><!--x-- #errors Line: 1 Col: 22 Unexpected end of file in comment (--). #document | <!DOCTYPE html> | <!-- x --> | <html> | <head> | <body> #data <!DOCTYPE html><table><tr><td></p></table> #errors Line: 1 Col: 34 Unexpected end tag (p). Ignored. #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <p> #data <!DOCTYPE <!DOCTYPE HTML>><!--<!--x-->--> #errors Line: 1 Col: 20 Expected space or '>'. Got '' Line: 1 Col: 25 Erroneous DOCTYPE. Line: 1 Col: 35 Unexpected character in comment found. #document | <!DOCTYPE <!doctype> | <html> | <head> | <body> | ">" | <!-- <!--x --> | "-->" #data <!doctype html><div><form></form><div></div></div> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <div> | <form> | <div> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests7.dat��������������������������������������������������������������0000644�0001751�0001751�00000014756�12235217213�017324� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <!doctype html><body><title>X</title> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <title> | "X" #data <!doctype html><table><title>X</title></table> #errors Line: 1 Col: 29 Unexpected start tag (title) in table context caused voodoo mode. Line: 1 Col: 38 Unexpected end tag (title) in table context caused voodoo mode. #document | <!DOCTYPE html> | <html> | <head> | <body> | <title> | "X" | <table> #data <!doctype html><head></head><title>X</title> #errors Line: 1 Col: 35 Unexpected start tag (title) that can be in head. Moved. #document | <!DOCTYPE html> | <html> | <head> | <title> | "X" | <body> #data <!doctype html></head><title>X</title> #errors Line: 1 Col: 29 Unexpected start tag (title) that can be in head. Moved. #document | <!DOCTYPE html> | <html> | <head> | <title> | "X" | <body> #data <!doctype html><table><meta></table> #errors Line: 1 Col: 28 Unexpected start tag (meta) in table context caused voodoo mode. #document | <!DOCTYPE html> | <html> | <head> | <body> | <meta> | <table> #data <!doctype html><table>X<tr><td><table> <meta></table></table> #errors Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode. Line: 1 Col: 45 Unexpected start tag (meta) in table context caused voodoo mode. #document | <!DOCTYPE html> | <html> | <head> | <body> | "X" | <table> | <tbody> | <tr> | <td> | <meta> | <table> | " " #data <!doctype html><html> <head> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> #data <!doctype html> <head> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> #data <!doctype html><table><style> <tr>x </style> </table> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <style> | " <tr>x " | " " #data <!doctype html><table><TBODY><script> <tr>x </script> </table> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <script> | " <tr>x " | " " #data <!doctype html><p><applet><p>X</p></applet> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <applet> | <p> | "X" #data <!doctype html><listing> X</listing> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <listing> | "X" #data <!doctype html><select><input>X #errors Line: 1 Col: 30 Unexpected input start tag in the select phase. #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | <input> | "X" #data <!doctype html><select><select>X #errors Line: 1 Col: 31 Unexpected select start tag in the select phase treated as select end tag. #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | "X" #data <!doctype html><table><input type=hidDEN></table> #errors Line: 1 Col: 41 Unexpected input with type hidden in table context. #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <input> | type="hidDEN" #data <!doctype html><table>X<input type=hidDEN></table> #errors Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode. #document | <!DOCTYPE html> | <html> | <head> | <body> | "X" | <table> | <input> | type="hidDEN" #data <!doctype html><table> <input type=hidDEN></table> #errors Line: 1 Col: 43 Unexpected input with type hidden in table context. #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | " " | <input> | type="hidDEN" #data <!doctype html><table> <input type='hidDEN'></table> #errors Line: 1 Col: 45 Unexpected input with type hidden in table context. #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | " " | <input> | type="hidDEN" #data <!doctype html><table><input type=" hidden"><input type=hidDEN></table> #errors Line: 1 Col: 44 Unexpected start tag (input) in table context caused voodoo mode. #document | <!DOCTYPE html> | <html> | <head> | <body> | <input> | type=" hidden" | <table> | <input> | type="hidDEN" #data <!doctype html><table><select>X<tr> #errors Line: 1 Col: 30 Unexpected start tag (select) in table context caused voodoo mode. Line: 1 Col: 35 Unexpected table element start tag (trs) in the select in table phase. Line: 1 Col: 35 Unexpected end of file. Expected table content. #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | "X" | <table> | <tbody> | <tr> #data <!doctype html><select>X</select> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | "X" #data <!DOCTYPE hTmL><html></html> #errors Line: 1 Col: 28 Unexpected end tag (html) after the (implied) root element. #document | <!DOCTYPE html> | <html> | <head> | <body> #data <!DOCTYPE HTML><html></html> #errors Line: 1 Col: 28 Unexpected end tag (html) after the (implied) root element. #document | <!DOCTYPE html> | <html> | <head> | <body> #data <body>X</body></body> #errors Line: 1 Col: 21 Unexpected end tag token (body) in the after body phase. Line: 1 Col: 21 Unexpected EOF in inner html mode. #document-fragment html #document | <head> | <body> | "X" #data <div><p>a</x> b #errors Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. Line: 1 Col: 13 Unexpected end tag (x). Ignored. Line: 1 Col: 15 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> | <p> | "a b" #data <table><tr><td><code></code> </table> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <code> | " " #data <table><b><tr><td>aaa</td></tr>bbb</table>ccc #errors XXX: Fix me #document | <html> | <head> | <body> | <b> | <b> | "bbb" | <table> | <tbody> | <tr> | <td> | "aaa" | <b> | "ccc" #data A<table><tr> B</tr> B</table> #errors XXX: Fix me #document | <html> | <head> | <body> | "A B B" | <table> | <tbody> | <tr> #data A<table><tr> B</tr> </em>C</table> #errors XXX: Fix me #document | <html> | <head> | <body> | "A BC" | <table> | <tbody> | <tr> | " " #data <select><keygen> #errors Not known #document | <html> | <head> | <body> | <select> | <keygen> ������������������go.net/html/testdata/webkit/adoption01.dat����������������������������������������������������������0000644�0001751�0001751�00000004277�12235217213�020046� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <a><p></a></p> #errors #document | <html> | <head> | <body> | <a> | <p> | <a> #data <a>1<p>2</a>3</p> #errors #document | <html> | <head> | <body> | <a> | "1" | <p> | <a> | "2" | "3" #data <a>1<button>2</a>3</button> #errors #document | <html> | <head> | <body> | <a> | "1" | <button> | <a> | "2" | "3" #data <a>1<b>2</a>3</b> #errors #document | <html> | <head> | <body> | <a> | "1" | <b> | "2" | <b> | "3" #data <a>1<div>2<div>3</a>4</div>5</div> #errors #document | <html> | <head> | <body> | <a> | "1" | <div> | <a> | "2" | <div> | <a> | "3" | "4" | "5" #data <table><a>1<p>2</a>3</p> #errors #document | <html> | <head> | <body> | <a> | "1" | <p> | <a> | "2" | "3" | <table> #data <b><b><a><p></a> #errors #document | <html> | <head> | <body> | <b> | <b> | <a> | <p> | <a> #data <b><a><b><p></a> #errors #document | <html> | <head> | <body> | <b> | <a> | <b> | <b> | <p> | <a> #data <a><b><b><p></a> #errors #document | <html> | <head> | <body> | <a> | <b> | <b> | <b> | <b> | <p> | <a> #data <p>1<s id="A">2<b id="B">3</p>4</s>5</b> #errors #document | <html> | <head> | <body> | <p> | "1" | <s> | id="A" | "2" | <b> | id="B" | "3" | <s> | id="A" | <b> | id="B" | "4" | <b> | id="B" | "5" #data <table><a>1<td>2</td>3</table> #errors #document | <html> | <head> | <body> | <a> | "1" | <a> | "3" | <table> | <tbody> | <tr> | <td> | "2" #data <table>A<td>B</td>C</table> #errors #document | <html> | <head> | <body> | "AC" | <table> | <tbody> | <tr> | <td> | "B" #data <a><svg><tr><input></a> #errors #document | <html> | <head> | <body> | <a> | <svg svg> | <svg tr> | <svg input> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/webkit01.dat������������������������������������������������������������0000644�0001751�0001751�00000017347�12235217213�017520� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data Test #errors Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. #document | <html> | <head> | <body> | "Test" #data <div></div> #errors #document | <html> | <head> | <body> | <div> #data <div>Test</div> #errors #document | <html> | <head> | <body> | <div> | "Test" #data <di #errors #document | <html> | <head> | <body> #data <div>Hello</div> <script> console.log("PASS"); </script> <div>Bye</div> #errors #document | <html> | <head> | <body> | <div> | "Hello" | " " | <script> | " console.log("PASS"); " | " " | <div> | "Bye" #data <div foo="bar">Hello</div> #errors #document | <html> | <head> | <body> | <div> | foo="bar" | "Hello" #data <div>Hello</div> <script> console.log("FOO<span>BAR</span>BAZ"); </script> <div>Bye</div> #errors #document | <html> | <head> | <body> | <div> | "Hello" | " " | <script> | " console.log("FOO<span>BAR</span>BAZ"); " | " " | <div> | "Bye" #data <foo bar="baz"></foo><potato quack="duck"></potato> #errors #document | <html> | <head> | <body> | <foo> | bar="baz" | <potato> | quack="duck" #data <foo bar="baz"><potato quack="duck"></potato></foo> #errors #document | <html> | <head> | <body> | <foo> | bar="baz" | <potato> | quack="duck" #data <foo></foo bar="baz"><potato></potato quack="duck"> #errors #document | <html> | <head> | <body> | <foo> | <potato> #data </ tttt> #errors #document | <!-- tttt --> | <html> | <head> | <body> #data <div FOO ><img><img></div> #errors #document | <html> | <head> | <body> | <div> | foo="" | <img> | <img> #data <p>Test</p<p>Test2</p> #errors #document | <html> | <head> | <body> | <p> | "TestTest2" #data <rdar://problem/6869687> #errors #document | <html> | <head> | <body> | <rdar:> | 6869687="" | problem="" #data <A>test< /A> #errors #document | <html> | <head> | <body> | <a> | "test< /A>" #data &lt; #errors #document | <html> | <head> | <body> | "<" #data <body foo='bar'><body foo='baz' yo='mama'> #errors #document | <html> | <head> | <body> | foo="bar" | yo="mama" #data <body></br foo="bar"></body> #errors #document | <html> | <head> | <body> | <br> #data <bdy><br foo="bar"></body> #errors #document | <html> | <head> | <body> | <bdy> | <br> | foo="bar" #data <body></body></br foo="bar"> #errors #document | <html> | <head> | <body> | <br> #data <bdy></body><br foo="bar"> #errors #document | <html> | <head> | <body> | <bdy> | <br> | foo="bar" #data <html><body></body></html><!-- Hi there --> #errors #document | <html> | <head> | <body> | <!-- Hi there --> #data <html><body></body></html>x<!-- Hi there --> #errors #document | <html> | <head> | <body> | "x" | <!-- Hi there --> #data <html><body></body></html>x<!-- Hi there --></html><!-- Again --> #errors #document | <html> | <head> | <body> | "x" | <!-- Hi there --> | <!-- Again --> #data <html><body></body></html>x<!-- Hi there --></body></html><!-- Again --> #errors #document | <html> | <head> | <body> | "x" | <!-- Hi there --> | <!-- Again --> #data <html><body><ruby><div><rp>xx</rp></div></ruby></body></html> #errors #document | <html> | <head> | <body> | <ruby> | <div> | <rp> | "xx" #data <html><body><ruby><div><rt>xx</rt></div></ruby></body></html> #errors #document | <html> | <head> | <body> | <ruby> | <div> | <rt> | "xx" #data <html><frameset><!--1--><noframes>A</noframes><!--2--></frameset><!--3--><noframes>B</noframes><!--4--></html><!--5--><noframes>C</noframes><!--6--> #errors #document | <html> | <head> | <frameset> | <!-- 1 --> | <noframes> | "A" | <!-- 2 --> | <!-- 3 --> | <noframes> | "B" | <!-- 4 --> | <noframes> | "C" | <!-- 5 --> | <!-- 6 --> #data <select><option>A<select><option>B<select><option>C<select><option>D<select><option>E<select><option>F<select><option>G<select> #errors #document | <html> | <head> | <body> | <select> | <option> | "A" | <option> | "B" | <select> | <option> | "C" | <option> | "D" | <select> | <option> | "E" | <option> | "F" | <select> | <option> | "G" #data <dd><dd><dt><dt><dd><li><li> #errors #document | <html> | <head> | <body> | <dd> | <dd> | <dt> | <dt> | <dd> | <li> | <li> #data <div><b></div><div><nobr>a<nobr> #errors #document | <html> | <head> | <body> | <div> | <b> | <div> | <b> | <nobr> | "a" | <nobr> #data <head></head> <body></body> #errors #document | <html> | <head> | " " | <body> #data <head></head> <style></style>ddd #errors #document | <html> | <head> | <style> | " " | <body> | "ddd" #data <kbd><table></kbd><col><select><tr> #errors #document | <html> | <head> | <body> | <kbd> | <select> | <table> | <colgroup> | <col> | <tbody> | <tr> #data <kbd><table></kbd><col><select><tr></table><div> #errors #document | <html> | <head> | <body> | <kbd> | <select> | <table> | <colgroup> | <col> | <tbody> | <tr> | <div> #data <a><li><style></style><title></title></a> #errors #document | <html> | <head> | <body> | <a> | <li> | <a> | <style> | <title> #data <font></p><p><meta><title></title></font> #errors #document | <html> | <head> | <body> | <font> | <p> | <p> | <font> | <meta> | <title> #data <a><center><title></title><a> #errors #document | <html> | <head> | <body> | <a> | <center> | <a> | <title> | <a> #data <svg><title><div> #errors #document | <html> | <head> | <body> | <svg svg> | <svg title> | <div> #data <svg><title><rect><div> #errors #document | <html> | <head> | <body> | <svg svg> | <svg title> | <rect> | <div> #data <svg><title><svg><div> #errors #document | <html> | <head> | <body> | <svg svg> | <svg title> | <svg svg> | <div> #data <img <="" FAIL> #errors #document | <html> | <head> | <body> | <img> | <="" | fail="" #data <ul><li><div id='foo'/>A</li><li>B<div>C</div></li></ul> #errors #document | <html> | <head> | <body> | <ul> | <li> | <div> | id="foo" | "A" | <li> | "B" | <div> | "C" #data <svg><em><desc></em> #errors #document | <html> | <head> | <body> | <svg svg> | <em> | <desc> #data <table><tr><td><svg><desc><td></desc><circle> #errors #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <svg svg> | <svg desc> | <td> | <circle> #data <svg><tfoot></mi><td> #errors #document | <html> | <head> | <body> | <svg svg> | <svg tfoot> | <svg td> #data <math><mrow><mrow><mn>1</mn></mrow><mi>a</mi></mrow></math> #errors #document | <html> | <head> | <body> | <math math> | <math mrow> | <math mrow> | <math mn> | "1" | <math mi> | "a" #data <!doctype html><input type="hidden"><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <frameset> #data <!doctype html><input type="button"><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <input> | type="button" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tricky01.dat������������������������������������������������������������0000644�0001751�0001751�00000007657�12235217213�017543� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <b><p>Bold </b> Not bold</p> Also not bold. #errors #document | <html> | <head> | <body> | <b> | <p> | <b> | "Bold " | " Not bold" | " Also not bold." #data <html> <font color=red><i>Italic and Red<p>Italic and Red </font> Just italic.</p> Italic only.</i> Plain <p>I should not be red. <font color=red>Red. <i>Italic and red.</p> <p>Italic and red. </i> Red.</font> I should not be red.</p> <b>Bold <i>Bold and italic</b> Only Italic </i> Plain #errors #document | <html> | <head> | <body> | <font> | color="red" | <i> | "Italic and Red" | <i> | <p> | <font> | color="red" | "Italic and Red " | " Just italic." | " Italic only." | " Plain " | <p> | "I should not be red. " | <font> | color="red" | "Red. " | <i> | "Italic and red." | <font> | color="red" | <i> | " " | <p> | <font> | color="red" | <i> | "Italic and red. " | " Red." | " I should not be red." | " " | <b> | "Bold " | <i> | "Bold and italic" | <i> | " Only Italic " | " Plain" #data <html><body> <p><font size="7">First paragraph.</p> <p>Second paragraph.</p></font> <b><p><i>Bold and Italic</b> Italic</p> #errors #document | <html> | <head> | <body> | " " | <p> | <font> | size="7" | "First paragraph." | <font> | size="7" | " " | <p> | "Second paragraph." | " " | <b> | <p> | <b> | <i> | "Bold and Italic" | <i> | " Italic" #data <html> <dl> <dt><b>Boo <dd>Goo? </dl> </html> #errors #document | <html> | <head> | <body> | <dl> | " " | <dt> | <b> | "Boo " | <dd> | <b> | "Goo? " | <b> | " " #data <html><body> <label><a><div>Hello<div>World</div></a></label> </body></html> #errors #document | <html> | <head> | <body> | " " | <label> | <a> | <div> | <a> | "Hello" | <div> | "World" | " " #data <table><center> <font>a</center> <img> <tr><td> </td> </tr> </table> #errors #document | <html> | <head> | <body> | <center> | " " | <font> | "a" | <font> | <img> | " " | <table> | " " | <tbody> | <tr> | <td> | " " | " " | " " #data <table><tr><p><a><p>You should see this text. #errors #document | <html> | <head> | <body> | <p> | <a> | <p> | <a> | "You should see this text." | <table> | <tbody> | <tr> #data <TABLE> <TR> <CENTER><CENTER><TD></TD></TR><TR> <FONT> <TABLE><tr></tr></TABLE> </P> <a></font><font></a> This page contains an insanely badly-nested tag sequence. #errors #document | <html> | <head> | <body> | <center> | <center> | <font> | " " | <table> | " " | <tbody> | <tr> | " " | <td> | <tr> | " " | <table> | <tbody> | <tr> | <font> | " " | <p> | " " | <a> | <a> | <font> | <font> | " This page contains an insanely badly-nested tag sequence." #data <html> <body> <b><nobr><div>This text is in a div inside a nobr</nobr>More text that should not be in the nobr, i.e., the nobr should have closed the div inside it implicitly. </b><pre>A pre tag outside everything else.</pre> </body> </html> #errors #document | <html> | <head> | <body> | " " | <b> | <nobr> | <div> | <b> | <nobr> | "This text is in a div inside a nobr" | "More text that should not be in the nobr, i.e., the nobr should have closed the div inside it implicitly. " | <pre> | "A pre tag outside everything else." | " " ���������������������������������������������������������������������������������go.net/html/testdata/webkit/doctype01.dat�����������������������������������������������������������0000644�0001751�0001751�00000013261�12235217213�017671� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <!DOCTYPE html>Hello #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | "Hello" #data <!dOctYpE HtMl>Hello #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | "Hello" #data <!DOCTYPEhtml>Hello #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE>Hello #errors #document | <!DOCTYPE > | <html> | <head> | <body> | "Hello" #data <!DOCTYPE >Hello #errors #document | <!DOCTYPE > | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato>Hello #errors #document | <!DOCTYPE potato> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato >Hello #errors #document | <!DOCTYPE potato> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato taco>Hello #errors #document | <!DOCTYPE potato> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato taco "ddd>Hello #errors #document | <!DOCTYPE potato> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato sYstEM>Hello #errors #document | <!DOCTYPE potato> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato sYstEM >Hello #errors #document | <!DOCTYPE potato> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato sYstEM ggg>Hello #errors #document | <!DOCTYPE potato> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato SYSTEM taco >Hello #errors #document | <!DOCTYPE potato> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato SYSTEM 'taco"'>Hello #errors #document | <!DOCTYPE potato "" "taco""> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato SYSTEM "taco">Hello #errors #document | <!DOCTYPE potato "" "taco"> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato SYSTEM "tai'co">Hello #errors #document | <!DOCTYPE potato "" "tai'co"> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato SYSTEMtaco "ddd">Hello #errors #document | <!DOCTYPE potato> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato grass SYSTEM taco>Hello #errors #document | <!DOCTYPE potato> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato pUbLIc>Hello #errors #document | <!DOCTYPE potato> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato pUbLIc >Hello #errors #document | <!DOCTYPE potato> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato pUbLIcgoof>Hello #errors #document | <!DOCTYPE potato> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato PUBLIC goof>Hello #errors #document | <!DOCTYPE potato> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato PUBLIC "go'of">Hello #errors #document | <!DOCTYPE potato "go'of" ""> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato PUBLIC 'go'of'>Hello #errors #document | <!DOCTYPE potato "go" ""> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato PUBLIC 'go:hh of' >Hello #errors #document | <!DOCTYPE potato "go:hh of" ""> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE potato PUBLIC "W3C-//dfdf" SYSTEM ggg>Hello #errors #document | <!DOCTYPE potato "W3C-//dfdf" ""> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">Hello #errors #document | <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE ...>Hello #errors #document | <!DOCTYPE ...> | <html> | <head> | <body> | "Hello" #data <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> #errors #document | <!DOCTYPE html "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | <html> | <head> | <body> #data <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> #errors #document | <!DOCTYPE html "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> | <html> | <head> | <body> #data <!DOCTYPE root-element [SYSTEM OR PUBLIC FPI] "uri" [ <!-- internal declarations --> ]> #errors #document | <!DOCTYPE root-element> | <html> | <head> | <body> | "]>" #data <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd"> #errors #document | <!DOCTYPE html "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd"> | <html> | <head> | <body> #data <!DOCTYPE HTML SYSTEM "http://www.w3.org/DTD/HTML4-strict.dtd"><body><b>Mine!</b></body> #errors #document | <!DOCTYPE html "" "http://www.w3.org/DTD/HTML4-strict.dtd"> | <html> | <head> | <body> | <b> | "Mine!" #data <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> #errors #document | <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> | <html> | <head> | <body> #data <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"'http://www.w3.org/TR/html4/strict.dtd'> #errors #document | <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> | <html> | <head> | <body> #data <!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01//EN"'http://www.w3.org/TR/html4/strict.dtd'> #errors #document | <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> | <html> | <head> | <body> #data <!DOCTYPE HTML PUBLIC'-//W3C//DTD HTML 4.01//EN''http://www.w3.org/TR/html4/strict.dtd'> #errors #document | <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> | <html> | <head> | <body> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/webkit02.dat������������������������������������������������������������0000644�0001751�0001751�00000004322�12235217213�017506� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <foo bar=qux/> #errors #document | <html> | <head> | <body> | <foo> | bar="qux/" #data <p id="status"><noscript><strong>A</strong></noscript><span>B</span></p> #errors #document | <html> | <head> | <body> | <p> | id="status" | <noscript> | "<strong>A</strong>" | <span> | "B" #data <div><sarcasm><div></div></sarcasm></div> #errors #document | <html> | <head> | <body> | <div> | <sarcasm> | <div> #data <html><body><img src="" border="0" alt="><div>A</div></body></html> #errors #document | <html> | <head> | <body> #data <table><td></tbody>A #errors #document | <html> | <head> | <body> | "A" | <table> | <tbody> | <tr> | <td> #data <table><td></thead>A #errors #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | "A" #data <table><td></tfoot>A #errors #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | "A" #data <table><thead><td></tbody>A #errors #document | <html> | <head> | <body> | <table> | <thead> | <tr> | <td> | "A" #data <legend>test</legend> #errors #document | <html> | <head> | <body> | <legend> | "test" #data <table><input> #errors #document | <html> | <head> | <body> | <input> | <table> #data <b><em><dcell><postfield><postfield><postfield><postfield><missing_glyph><missing_glyph><missing_glyph><missing_glyph><hkern><aside></b></em> #errors #document-fragment div #document | <b> | <em> | <dcell> | <postfield> | <postfield> | <postfield> | <postfield> | <missing_glyph> | <missing_glyph> | <missing_glyph> | <missing_glyph> | <hkern> | <aside> | <em> | <b> #data <isindex action="x"> #errors #document-fragment table #document | <form> | action="x" | <hr> | <label> | "This is a searchable index. Enter search keywords: " | <input> | name="isindex" | <hr> #data <option><XH<optgroup></optgroup> #errors #document-fragment select #document | <option> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests26.dat�������������������������������������������������������������0000644�0001751�0001751�00000012312�12235217213�017367� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <!DOCTYPE html><body><a href='#1'><nobr>1<nobr></a><br><a href='#2'><nobr>2<nobr></a><br><a href='#3'><nobr>3<nobr></a> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <a> | href="#1" | <nobr> | "1" | <nobr> | <nobr> | <br> | <a> | href="#2" | <a> | href="#2" | <nobr> | "2" | <nobr> | <nobr> | <br> | <a> | href="#3" | <a> | href="#3" | <nobr> | "3" | <nobr> #data <!DOCTYPE html><body><b><nobr>1<nobr></b><i><nobr>2<nobr></i>3 #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <b> | <nobr> | "1" | <nobr> | <nobr> | <i> | <i> | <nobr> | "2" | <nobr> | <nobr> | "3" #data <!DOCTYPE html><body><b><nobr>1<table><nobr></b><i><nobr>2<nobr></i>3 #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <b> | <nobr> | "1" | <nobr> | <i> | <i> | <nobr> | "2" | <nobr> | <nobr> | "3" | <table> #data <!DOCTYPE html><body><b><nobr>1<table><tr><td><nobr></b><i><nobr>2<nobr></i>3 #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <b> | <nobr> | "1" | <table> | <tbody> | <tr> | <td> | <nobr> | <i> | <i> | <nobr> | "2" | <nobr> | <nobr> | "3" #data <!DOCTYPE html><body><b><nobr>1<div><nobr></b><i><nobr>2<nobr></i>3 #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <b> | <nobr> | "1" | <div> | <b> | <nobr> | <nobr> | <nobr> | <i> | <i> | <nobr> | "2" | <nobr> | <nobr> | "3" #data <!DOCTYPE html><body><b><nobr>1<nobr></b><div><i><nobr>2<nobr></i>3 #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <b> | <nobr> | "1" | <nobr> | <div> | <nobr> | <i> | <i> | <nobr> | "2" | <nobr> | <nobr> | "3" #data <!DOCTYPE html><body><b><nobr>1<nobr><ins></b><i><nobr> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <b> | <nobr> | "1" | <nobr> | <ins> | <nobr> | <i> | <i> | <nobr> #data <!DOCTYPE html><body><b><nobr>1<ins><nobr></b><i>2 #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <b> | <nobr> | "1" | <ins> | <nobr> | <nobr> | <i> | "2" #data <!DOCTYPE html><body><b>1<nobr></b><i><nobr>2</i> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <b> | "1" | <nobr> | <nobr> | <i> | <i> | <nobr> | "2" #data <p><code x</code></p> #errors #document | <html> | <head> | <body> | <p> | <code> | code="" | x<="" | <code> | code="" | x<="" | " " #data <!DOCTYPE html><svg><foreignObject><p><i></p>a #errors 45: End tag “p” seen, but there were open elements. 41: Unclosed element “i”. 46: End of file seen and there were open elements. 35: Unclosed element “foreignObject”. 20: Unclosed element “svg”. #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | <svg foreignObject> | <p> | <i> | <i> | "a" #data <!DOCTYPE html><table><tr><td><svg><foreignObject><p><i></p>a #errors 56: End tag “p” seen, but there were open elements. 52: Unclosed element “i”. 57: End of file seen and there were open elements. 46: Unclosed element “foreignObject”. 31: Unclosed element “svg”. 22: Unclosed element “table”. #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <svg svg> | <svg foreignObject> | <p> | <i> | <i> | "a" #data <!DOCTYPE html><math><mtext><p><i></p>a #errors 38: End tag “p” seen, but there were open elements. 34: Unclosed element “i”. 39: End of file in a foreign namespace context. #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | <math mtext> | <p> | <i> | <i> | "a" #data <!DOCTYPE html><table><tr><td><math><mtext><p><i></p>a #errors 53: End tag “p” seen, but there were open elements. 49: Unclosed element “i”. 54: End of file in a foreign namespace context. #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <math math> | <math mtext> | <p> | <i> | <i> | "a" #data <!DOCTYPE html><body><div><!/div>a #errors 29: Bogus comment. 34: End of file seen and there were open elements. 26: Unclosed element “div”. #document | <!DOCTYPE html> | <html> | <head> | <body> | <div> | <!-- /div --> | "a" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests15.dat�������������������������������������������������������������0000644�0001751�0001751�00000010057�12235217213�017371� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <!DOCTYPE html><p><b><i><u></p> <p>X #errors Line: 1 Col: 31 Unexpected end tag (p). Ignored. Line: 1 Col: 36 Expected closing tag. Unexpected end of file. #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <b> | <i> | <u> | <b> | <i> | <u> | " " | <p> | "X" #data <p><b><i><u></p> <p>X #errors Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. Line: 1 Col: 16 Unexpected end tag (p). Ignored. Line: 2 Col: 4 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <p> | <b> | <i> | <u> | <b> | <i> | <u> | " " | <p> | "X" #data <!doctype html></html> <head> #errors Line: 1 Col: 22 Unexpected end tag (html) after the (implied) root element. #document | <!DOCTYPE html> | <html> | <head> | <body> | " " #data <!doctype html></body><meta> #errors Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. #document | <!DOCTYPE html> | <html> | <head> | <body> | <meta> #data <html></html><!-- foo --> #errors Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. Line: 1 Col: 13 Unexpected end tag (html) after the (implied) root element. #document | <html> | <head> | <body> | <!-- foo --> #data <!doctype html></body><title>X</title> #errors Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. #document | <!DOCTYPE html> | <html> | <head> | <body> | <title> | "X" #data <!doctype html><table> X<meta></table> #errors Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. Line: 1 Col: 30 Unexpected start tag (meta) in table context caused voodoo mode. #document | <!DOCTYPE html> | <html> | <head> | <body> | " X" | <meta> | <table> #data <!doctype html><table> x</table> #errors Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. #document | <!DOCTYPE html> | <html> | <head> | <body> | " x" | <table> #data <!doctype html><table> x </table> #errors Line: 1 Col: 25 Unexpected non-space characters in table context caused voodoo mode. #document | <!DOCTYPE html> | <html> | <head> | <body> | " x " | <table> #data <!doctype html><table><tr> x</table> #errors Line: 1 Col: 28 Unexpected non-space characters in table context caused voodoo mode. #document | <!DOCTYPE html> | <html> | <head> | <body> | " x" | <table> | <tbody> | <tr> #data <!doctype html><table>X<style> <tr>x </style> </table> #errors Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode. #document | <!DOCTYPE html> | <html> | <head> | <body> | "X" | <table> | <style> | " <tr>x " | " " #data <!doctype html><div><table><a>foo</a> <tr><td>bar</td> </tr></table></div> #errors Line: 1 Col: 30 Unexpected start tag (a) in table context caused voodoo mode. Line: 1 Col: 37 Unexpected end tag (a) in table context caused voodoo mode. #document | <!DOCTYPE html> | <html> | <head> | <body> | <div> | <a> | "foo" | <table> | " " | <tbody> | <tr> | <td> | "bar" | " " #data <frame></frame></frame><frameset><frame><frameset><frame></frameset><noframes></frameset><noframes> #errors 6: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. 13: Stray start tag “frame”. 21: Stray end tag “frame”. 29: Stray end tag “frame”. 39: “frameset” start tag after “body” already open. 105: End of file seen inside an [R]CDATA element. 105: End of file seen and there were open elements. XXX: These errors are wrong, please fix me! #document | <html> | <head> | <frameset> | <frame> | <frameset> | <frame> | <noframes> | "</frameset><noframes>" #data <!DOCTYPE html><object></html> #errors 1: Expected closing tag. Unexpected end of file #document | <!DOCTYPE html> | <html> | <head> | <body> | <object> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests8.dat��������������������������������������������������������������0000644�0001751�0001751�00000006501�12235217213�017312� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <div> <div></div> </span>x #errors Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. Line: 3 Col: 7 Unexpected end tag (span). Ignored. Line: 3 Col: 8 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> | " " | <div> | " x" #data <div>x<div></div> </span>x #errors Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. Line: 2 Col: 7 Unexpected end tag (span). Ignored. Line: 2 Col: 8 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> | "x" | <div> | " x" #data <div>x<div></div>x</span>x #errors Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. Line: 1 Col: 25 Unexpected end tag (span). Ignored. Line: 1 Col: 26 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> | "x" | <div> | "xx" #data <div>x<div></div>y</span>z #errors Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. Line: 1 Col: 25 Unexpected end tag (span). Ignored. Line: 1 Col: 26 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> | "x" | <div> | "yz" #data <table><div>x<div></div>x</span>x #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 12 Unexpected start tag (div) in table context caused voodoo mode. Line: 1 Col: 18 Unexpected start tag (div) in table context caused voodoo mode. Line: 1 Col: 24 Unexpected end tag (div) in table context caused voodoo mode. Line: 1 Col: 32 Unexpected end tag (span) in table context caused voodoo mode. Line: 1 Col: 32 Unexpected end tag (span). Ignored. Line: 1 Col: 33 Unexpected end of file. Expected table content. #document | <html> | <head> | <body> | <div> | "x" | <div> | "xx" | <table> #data x<table>x #errors Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. Line: 1 Col: 9 Unexpected non-space characters in table context caused voodoo mode. Line: 1 Col: 9 Unexpected end of file. Expected table content. #document | <html> | <head> | <body> | "xx" | <table> #data x<table><table>x #errors Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. Line: 1 Col: 15 Unexpected start tag (table) implies end tag (table). Line: 1 Col: 16 Unexpected non-space characters in table context caused voodoo mode. Line: 1 Col: 16 Unexpected end of file. Expected table content. #document | <html> | <head> | <body> | "x" | <table> | "x" | <table> #data <b>a<div></div><div></b>y #errors Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. Line: 1 Col: 24 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 25 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <b> | "a" | <div> | <div> | <b> | "y" #data <a><div><p></a> #errors Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE. Line: 1 Col: 15 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 15 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 15 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <a> | <div> | <a> | <p> | <a> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/comments01.dat����������������������������������������������������������0000644�0001751�0001751�00000003045�12235217213�020046� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data FOO<!-- BAR -->BAZ #errors #document | <html> | <head> | <body> | "FOO" | <!-- BAR --> | "BAZ" #data FOO<!-- BAR --!>BAZ #errors #document | <html> | <head> | <body> | "FOO" | <!-- BAR --> | "BAZ" #data FOO<!-- BAR -- >BAZ #errors #document | <html> | <head> | <body> | "FOO" | <!-- BAR -- >BAZ --> #data FOO<!-- BAR -- <QUX> -- MUX -->BAZ #errors #document | <html> | <head> | <body> | "FOO" | <!-- BAR -- <QUX> -- MUX --> | "BAZ" #data FOO<!-- BAR -- <QUX> -- MUX --!>BAZ #errors #document | <html> | <head> | <body> | "FOO" | <!-- BAR -- <QUX> -- MUX --> | "BAZ" #data FOO<!-- BAR -- <QUX> -- MUX -- >BAZ #errors #document | <html> | <head> | <body> | "FOO" | <!-- BAR -- <QUX> -- MUX -- >BAZ --> #data FOO<!---->BAZ #errors #document | <html> | <head> | <body> | "FOO" | <!-- --> | "BAZ" #data FOO<!--->BAZ #errors #document | <html> | <head> | <body> | "FOO" | <!-- --> | "BAZ" #data FOO<!-->BAZ #errors #document | <html> | <head> | <body> | "FOO" | <!-- --> | "BAZ" #data <?xml version="1.0">Hi #errors #document | <!-- ?xml version="1.0" --> | <html> | <head> | <body> | "Hi" #data <?xml version="1.0"> #errors #document | <!-- ?xml version="1.0" --> | <html> | <head> | <body> #data <?xml version #errors #document | <!-- ?xml version --> | <html> | <head> | <body> #data FOO<!----->BAZ #errors #document | <html> | <head> | <body> | "FOO" | <!-- - --> | "BAZ" �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests_innerHTML_1.dat���������������������������������������������������0000644�0001751�0001751�00000015046�12235217213�021326� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <body><span> #errors #document-fragment body #document | <span> #data <span><body> #errors #document-fragment body #document | <span> #data <span><body> #errors #document-fragment div #document | <span> #data <body><span> #errors #document-fragment html #document | <head> | <body> | <span> #data <frameset><span> #errors #document-fragment body #document | <span> #data <span><frameset> #errors #document-fragment body #document | <span> #data <span><frameset> #errors #document-fragment div #document | <span> #data <frameset><span> #errors #document-fragment html #document | <head> | <frameset> #data <table><tr> #errors #document-fragment table #document | <tbody> | <tr> #data </table><tr> #errors #document-fragment table #document | <tbody> | <tr> #data <a> #errors #document-fragment table #document | <a> #data <a> #errors #document-fragment table #document | <a> #data <a><caption>a #errors #document-fragment table #document | <a> | <caption> | "a" #data <a><colgroup><col> #errors #document-fragment table #document | <a> | <colgroup> | <col> #data <a><tbody><tr> #errors #document-fragment table #document | <a> | <tbody> | <tr> #data <a><tfoot><tr> #errors #document-fragment table #document | <a> | <tfoot> | <tr> #data <a><thead><tr> #errors #document-fragment table #document | <a> | <thead> | <tr> #data <a><tr> #errors #document-fragment table #document | <a> | <tbody> | <tr> #data <a><th> #errors #document-fragment table #document | <a> | <tbody> | <tr> | <th> #data <a><td> #errors #document-fragment table #document | <a> | <tbody> | <tr> | <td> #data <table></table><tbody> #errors #document-fragment caption #document | <table> #data </table><span> #errors #document-fragment caption #document | <span> #data <span></table> #errors #document-fragment caption #document | <span> #data </caption><span> #errors #document-fragment caption #document | <span> #data <span></caption><span> #errors #document-fragment caption #document | <span> | <span> #data <span><caption><span> #errors #document-fragment caption #document | <span> | <span> #data <span><col><span> #errors #document-fragment caption #document | <span> | <span> #data <span><colgroup><span> #errors #document-fragment caption #document | <span> | <span> #data <span><html><span> #errors #document-fragment caption #document | <span> | <span> #data <span><tbody><span> #errors #document-fragment caption #document | <span> | <span> #data <span><td><span> #errors #document-fragment caption #document | <span> | <span> #data <span><tfoot><span> #errors #document-fragment caption #document | <span> | <span> #data <span><thead><span> #errors #document-fragment caption #document | <span> | <span> #data <span><th><span> #errors #document-fragment caption #document | <span> | <span> #data <span><tr><span> #errors #document-fragment caption #document | <span> | <span> #data <span></table><span> #errors #document-fragment caption #document | <span> | <span> #data </colgroup><col> #errors #document-fragment colgroup #document | <col> #data <a><col> #errors #document-fragment colgroup #document | <col> #data <caption><a> #errors #document-fragment tbody #document | <a> #data <col><a> #errors #document-fragment tbody #document | <a> #data <colgroup><a> #errors #document-fragment tbody #document | <a> #data <tbody><a> #errors #document-fragment tbody #document | <a> #data <tfoot><a> #errors #document-fragment tbody #document | <a> #data <thead><a> #errors #document-fragment tbody #document | <a> #data </table><a> #errors #document-fragment tbody #document | <a> #data <a><tr> #errors #document-fragment tbody #document | <a> | <tr> #data <a><td> #errors #document-fragment tbody #document | <a> | <tr> | <td> #data <a><td> #errors #document-fragment tbody #document | <a> | <tr> | <td> #data <a><td> #errors #document-fragment tbody #document | <a> | <tr> | <td> #data <td><table><tbody><a><tr> #errors #document-fragment tbody #document | <tr> | <td> | <a> | <table> | <tbody> | <tr> #data </tr><td> #errors #document-fragment tr #document | <td> #data <td><table><a><tr></tr><tr> #errors #document-fragment tr #document | <td> | <a> | <table> | <tbody> | <tr> | <tr> #data <caption><td> #errors #document-fragment tr #document | <td> #data <col><td> #errors #document-fragment tr #document | <td> #data <colgroup><td> #errors #document-fragment tr #document | <td> #data <tbody><td> #errors #document-fragment tr #document | <td> #data <tfoot><td> #errors #document-fragment tr #document | <td> #data <thead><td> #errors #document-fragment tr #document | <td> #data <tr><td> #errors #document-fragment tr #document | <td> #data </table><td> #errors #document-fragment tr #document | <td> #data <td><table></table><td> #errors #document-fragment tr #document | <td> | <table> | <td> #data <td><table></table><td> #errors #document-fragment tr #document | <td> | <table> | <td> #data <caption><a> #errors #document-fragment td #document | <a> #data <col><a> #errors #document-fragment td #document | <a> #data <colgroup><a> #errors #document-fragment td #document | <a> #data <tbody><a> #errors #document-fragment td #document | <a> #data <tfoot><a> #errors #document-fragment td #document | <a> #data <th><a> #errors #document-fragment td #document | <a> #data <thead><a> #errors #document-fragment td #document | <a> #data <tr><a> #errors #document-fragment td #document | <a> #data </table><a> #errors #document-fragment td #document | <a> #data </tbody><a> #errors #document-fragment td #document | <a> #data </td><a> #errors #document-fragment td #document | <a> #data </tfoot><a> #errors #document-fragment td #document | <a> #data </thead><a> #errors #document-fragment td #document | <a> #data </th><a> #errors #document-fragment td #document | <a> #data </tr><a> #errors #document-fragment td #document | <a> #data <table><td><td> #errors #document-fragment td #document | <table> | <tbody> | <tr> | <td> | <td> #data </select><option> #errors #document-fragment select #document | <option> #data <input><option> #errors #document-fragment select #document | <option> #data <keygen><option> #errors #document-fragment select #document | <option> #data <textarea><option> #errors #document-fragment select #document | <option> #data </html><!--abc--> #errors #document-fragment html #document | <head> | <body> | <!-- abc --> #data </frameset><frame> #errors #document-fragment frameset #document | <frame> #data #errors #document-fragment html #document | <head> | <body> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests5.dat��������������������������������������������������������������0000644�0001751�0001751�00000006131�12235217213�017306� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <style> <!-- </style>x #errors Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. Line: 1 Col: 22 Unexpected end of file. Expected end tag (style). #document | <html> | <head> | <style> | " <!-- " | <body> | "x" #data <style> <!-- </style> --> </style>x #errors Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. #document | <html> | <head> | <style> | " <!-- " | " " | <body> | "--> x" #data <style> <!--> </style>x #errors Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. #document | <html> | <head> | <style> | " <!--> " | <body> | "x" #data <style> <!---> </style>x #errors Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. #document | <html> | <head> | <style> | " <!---> " | <body> | "x" #data <iframe> <!---> </iframe>x #errors Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. #document | <html> | <head> | <body> | <iframe> | " <!---> " | "x" #data <iframe> <!--- </iframe>->x</iframe> --> </iframe>x #errors Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. #document | <html> | <head> | <body> | <iframe> | " <!--- " | "->x --> x" #data <script> <!-- </script> --> </script>x #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. #document | <html> | <head> | <script> | " <!-- " | " " | <body> | "--> x" #data <title> <!-- </title> --> </title>x #errors Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. #document | <html> | <head> | <title> | " <!-- " | " " | <body> | "--> x" #data <textarea> <!--- </textarea>->x</textarea> --> </textarea>x #errors Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. #document | <html> | <head> | <body> | <textarea> | " <!--- " | "->x --> x" #data <style> <!</-- </style>x #errors Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. #document | <html> | <head> | <style> | " <!</-- " | <body> | "x" #data <p><xmp></xmp> #errors XXX: Unknown #document | <html> | <head> | <body> | <p> | <xmp> #data <xmp> <!-- > --> </xmp> #errors Line: 1 Col: 5 Unexpected start tag (xmp). Expected DOCTYPE. #document | <html> | <head> | <body> | <xmp> | " <!-- > --> " #data <title>&amp;</title> #errors Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. #document | <html> | <head> | <title> | "&" | <body> #data <title><!--&amp;--></title> #errors Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. #document | <html> | <head> | <title> | "<!--&-->" | <body> #data <title><!--</title> #errors Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. Line: 1 Col: 19 Unexpected end of file. Expected end tag (title). #document | <html> | <head> | <title> | "<!--" | <body> #data <noscript><!--</noscript>--></noscript> #errors Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. #document | <html> | <head> | <noscript> | "<!--" | <body> | "-->" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/plain-text-unsafe.dat���������������������������������������������������0000644�0001751�0001751�00000010106�12235217213�021420� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data FOO&#x000D;ZOO #errors #document | <html> | <head> | <body> | "FOO ZOO" #data <html>�<frameset></frameset> #errors #document | <html> | <head> | <frameset> #data <html> � <frameset></frameset> #errors #document | <html> | <head> | <frameset> #data <html>a�a<frameset></frameset> #errors #document | <html> | <head> | <body> | "aa" #data <html>��<frameset></frameset> #errors #document | <html> | <head> | <frameset> #data <html>� <frameset></frameset> #errors #document | <html> | <head> | <frameset> #data <html><select>� #errors #document | <html> | <head> | <body> | <select> #data � #errors #document | <html> | <head> | <body> #data <body>� #errors #document | <html> | <head> | <body> #data <plaintext>�filler�text� #errors #document | <html> | <head> | <body> | <plaintext> | "�filler�text�" #data <svg><![CDATA[�filler�text�]]> #errors #document | <html> | <head> | <body> | <svg svg> | "�filler�text�" #data <body><!�> #errors #document | <html> | <head> | <body> | <!-- � --> #data <body><!�filler�text> #errors #document | <html> | <head> | <body> | <!-- �filler�text --> #data <body><svg><foreignObject>�filler�text #errors #document | <html> | <head> | <body> | <svg svg> | <svg foreignObject> | "fillertext" #data <svg>�filler�text #errors #document | <html> | <head> | <body> | <svg svg> | "�filler�text" #data <svg>�<frameset> #errors #document | <html> | <head> | <body> | <svg svg> | "�" | <svg frameset> #data <svg>� <frameset> #errors #document | <html> | <head> | <body> | <svg svg> | "� " | <svg frameset> #data <svg>�a<frameset> #errors #document | <html> | <head> | <body> | <svg svg> | "�a" | <svg frameset> #data <svg>�</svg><frameset> #errors #document | <html> | <head> | <frameset> #data <svg>� </svg><frameset> #errors #document | <html> | <head> | <frameset> #data <svg>�a</svg><frameset> #errors #document | <html> | <head> | <body> | <svg svg> | "�a" #data <svg><path></path></svg><frameset> #errors #document | <html> | <head> | <frameset> #data <svg><p><frameset> #errors #document | <html> | <head> | <frameset> #data <!DOCTYPE html><pre> A</pre> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <pre> | " A" #data <!DOCTYPE html><pre> A</pre> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <pre> | " A" #data <!DOCTYPE html><pre> A</pre> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <pre> | "A" #data <!DOCTYPE html><table><tr><td><math><mtext>�a #errors 44: Saw U+0000 in stream. 45: End of file in a foreign namespace context. #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <math math> | <math mtext> | "a" #data <!DOCTYPE html><table><tr><td><svg><foreignObject>�a #errors 44: Saw U+0000 in stream. 45: End of file in a foreign namespace context. #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <svg svg> | <svg foreignObject> | "a" #data <!DOCTYPE html><math><mi>a�b #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | <math mi> | "ab" #data <!DOCTYPE html><math><mo>a�b #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | <math mo> | "ab" #data <!DOCTYPE html><math><mn>a�b #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | <math mn> | "ab" #data <!DOCTYPE html><math><ms>a�b #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | <math ms> | "ab" #data <!DOCTYPE html><math><mtext>a�b #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | <math mtext> | "ab" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/entities01.dat����������������������������������������������������������0000644�0001751�0001751�00000013421�12235217213�020044� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data FOO&gt;BAR #errors #document | <html> | <head> | <body> | "FOO>BAR" #data FOO&gtBAR #errors #document | <html> | <head> | <body> | "FOO>BAR" #data FOO&gt BAR #errors #document | <html> | <head> | <body> | "FOO> BAR" #data FOO&gt;;;BAR #errors #document | <html> | <head> | <body> | "FOO>;;BAR" #data I'm &notit; I tell you #errors #document | <html> | <head> | <body> | "I'm ¬it; I tell you" #data I'm &notin; I tell you #errors #document | <html> | <head> | <body> | "I'm ∉ I tell you" #data FOO& BAR #errors #document | <html> | <head> | <body> | "FOO& BAR" #data FOO&<BAR> #errors #document | <html> | <head> | <body> | "FOO&" | <bar> #data FOO&&&&gt;BAR #errors #document | <html> | <head> | <body> | "FOO&&&>BAR" #data FOO&#41;BAR #errors #document | <html> | <head> | <body> | "FOO)BAR" #data FOO&#x41;BAR #errors #document | <html> | <head> | <body> | "FOOABAR" #data FOO&#X41;BAR #errors #document | <html> | <head> | <body> | "FOOABAR" #data FOO&#BAR #errors #document | <html> | <head> | <body> | "FOO&#BAR" #data FOO&#ZOO #errors #document | <html> | <head> | <body> | "FOO&#ZOO" #data FOO&#xBAR #errors #document | <html> | <head> | <body> | "FOOºR" #data FOO&#xZOO #errors #document | <html> | <head> | <body> | "FOO&#xZOO" #data FOO&#XZOO #errors #document | <html> | <head> | <body> | "FOO&#XZOO" #data FOO&#41BAR #errors #document | <html> | <head> | <body> | "FOO)BAR" #data FOO&#x41BAR #errors #document | <html> | <head> | <body> | "FOO䆺R" #data FOO&#x41ZOO #errors #document | <html> | <head> | <body> | "FOOAZOO" #data FOO&#x0000;ZOO #errors #document | <html> | <head> | <body> | "FOO�ZOO" #data FOO&#x0078;ZOO #errors #document | <html> | <head> | <body> | "FOOxZOO" #data FOO&#x0079;ZOO #errors #document | <html> | <head> | <body> | "FOOyZOO" #data FOO&#x0080;ZOO #errors #document | <html> | <head> | <body> | "FOO€ZOO" #data FOO&#x0081;ZOO #errors #document | <html> | <head> | <body> | "FOOZOO" #data FOO&#x0082;ZOO #errors #document | <html> | <head> | <body> | "FOO‚ZOO" #data FOO&#x0083;ZOO #errors #document | <html> | <head> | <body> | "FOOƒZOO" #data FOO&#x0084;ZOO #errors #document | <html> | <head> | <body> | "FOO„ZOO" #data FOO&#x0085;ZOO #errors #document | <html> | <head> | <body> | "FOO…ZOO" #data FOO&#x0086;ZOO #errors #document | <html> | <head> | <body> | "FOO†ZOO" #data FOO&#x0087;ZOO #errors #document | <html> | <head> | <body> | "FOO‡ZOO" #data FOO&#x0088;ZOO #errors #document | <html> | <head> | <body> | "FOOˆZOO" #data FOO&#x0089;ZOO #errors #document | <html> | <head> | <body> | "FOO‰ZOO" #data FOO&#x008A;ZOO #errors #document | <html> | <head> | <body> | "FOOŠZOO" #data FOO&#x008B;ZOO #errors #document | <html> | <head> | <body> | "FOO‹ZOO" #data FOO&#x008C;ZOO #errors #document | <html> | <head> | <body> | "FOOŒZOO" #data FOO&#x008D;ZOO #errors #document | <html> | <head> | <body> | "FOOZOO" #data FOO&#x008E;ZOO #errors #document | <html> | <head> | <body> | "FOOŽZOO" #data FOO&#x008F;ZOO #errors #document | <html> | <head> | <body> | "FOOZOO" #data FOO&#x0090;ZOO #errors #document | <html> | <head> | <body> | "FOOZOO" #data FOO&#x0091;ZOO #errors #document | <html> | <head> | <body> | "FOO‘ZOO" #data FOO&#x0092;ZOO #errors #document | <html> | <head> | <body> | "FOO’ZOO" #data FOO&#x0093;ZOO #errors #document | <html> | <head> | <body> | "FOO“ZOO" #data FOO&#x0094;ZOO #errors #document | <html> | <head> | <body> | "FOO”ZOO" #data FOO&#x0095;ZOO #errors #document | <html> | <head> | <body> | "FOO•ZOO" #data FOO&#x0096;ZOO #errors #document | <html> | <head> | <body> | "FOO–ZOO" #data FOO&#x0097;ZOO #errors #document | <html> | <head> | <body> | "FOO—ZOO" #data FOO&#x0098;ZOO #errors #document | <html> | <head> | <body> | "FOO˜ZOO" #data FOO&#x0099;ZOO #errors #document | <html> | <head> | <body> | "FOO™ZOO" #data FOO&#x009A;ZOO #errors #document | <html> | <head> | <body> | "FOOšZOO" #data FOO&#x009B;ZOO #errors #document | <html> | <head> | <body> | "FOO›ZOO" #data FOO&#x009C;ZOO #errors #document | <html> | <head> | <body> | "FOOœZOO" #data FOO&#x009D;ZOO #errors #document | <html> | <head> | <body> | "FOOZOO" #data FOO&#x009E;ZOO #errors #document | <html> | <head> | <body> | "FOOžZOO" #data FOO&#x009F;ZOO #errors #document | <html> | <head> | <body> | "FOOŸZOO" #data FOO&#x00A0;ZOO #errors #document | <html> | <head> | <body> | "FOO ZOO" #data FOO&#xD7FF;ZOO #errors #document | <html> | <head> | <body> | "FOO퟿ZOO" #data FOO&#xD800;ZOO #errors #document | <html> | <head> | <body> | "FOO�ZOO" #data FOO&#xD801;ZOO #errors #document | <html> | <head> | <body> | "FOO�ZOO" #data FOO&#xDFFE;ZOO #errors #document | <html> | <head> | <body> | "FOO�ZOO" #data FOO&#xDFFF;ZOO #errors #document | <html> | <head> | <body> | "FOO�ZOO" #data FOO&#xE000;ZOO #errors #document | <html> | <head> | <body> | "FOOZOO" #data FOO&#x10FFFE;ZOO #errors #document | <html> | <head> | <body> | "FOO􏿾ZOO" #data FOO&#x1087D4;ZOO #errors #document | <html> | <head> | <body> | "FOO􈟔ZOO" #data FOO&#x10FFFF;ZOO #errors #document | <html> | <head> | <body> | "FOO􏿿ZOO" #data FOO&#x110000;ZOO #errors #document | <html> | <head> | <body> | "FOO�ZOO" #data FOO&#xFFFFFF;ZOO #errors #document | <html> | <head> | <body> | "FOO�ZOO" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests12.dat�������������������������������������������������������������0000644�0001751�0001751�00000003114�12235217213�017362� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <!DOCTYPE html><body><p>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | "foo" | <math math> | <math mtext> | <i> | "baz" | <math annotation-xml> | <svg svg> | <svg desc> | <b> | "eggs" | <svg g> | <svg foreignObject> | <p> | "spam" | <table> | <tbody> | <tr> | <td> | <img> | <svg g> | "quux" | "bar" #data <!DOCTYPE html><body>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | "foo" | <math math> | <math mtext> | <i> | "baz" | <math annotation-xml> | <svg svg> | <svg desc> | <b> | "eggs" | <svg g> | <svg foreignObject> | <p> | "spam" | <table> | <tbody> | <tr> | <td> | <img> | <svg g> | "quux" | "bar" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests20.dat�������������������������������������������������������������0000644�0001751�0001751�00000013650�12235217213�017367� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <!doctype html><p><button><button> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <button> | <button> #data <!doctype html><p><button><address> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <button> | <address> #data <!doctype html><p><button><blockquote> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <button> | <blockquote> #data <!doctype html><p><button><menu> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <button> | <menu> #data <!doctype html><p><button><p> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <button> | <p> #data <!doctype html><p><button><ul> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <button> | <ul> #data <!doctype html><p><button><h1> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <button> | <h1> #data <!doctype html><p><button><h6> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <button> | <h6> #data <!doctype html><p><button><listing> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <button> | <listing> #data <!doctype html><p><button><pre> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <button> | <pre> #data <!doctype html><p><button><form> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <button> | <form> #data <!doctype html><p><button><li> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <button> | <li> #data <!doctype html><p><button><dd> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <button> | <dd> #data <!doctype html><p><button><dt> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <button> | <dt> #data <!doctype html><p><button><plaintext> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <button> | <plaintext> #data <!doctype html><p><button><table> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <button> | <table> #data <!doctype html><p><button><hr> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <button> | <hr> #data <!doctype html><p><button><xmp> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <button> | <xmp> #data <!doctype html><p><button></p> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <button> | <p> #data <!doctype html><address><button></address>a #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <address> | <button> | "a" #data <!doctype html><address><button></address>a #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <address> | <button> | "a" #data <p><table></p> #errors #document | <html> | <head> | <body> | <p> | <p> | <table> #data <!doctype html><svg> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> #data <!doctype html><p><figcaption> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <figcaption> #data <!doctype html><p><summary> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <summary> #data <!doctype html><form><table><form> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <form> | <table> #data <!doctype html><table><form><form> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <form> #data <!doctype html><table><form></table><form> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <form> #data <!doctype html><svg><foreignObject><p> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | <svg foreignObject> | <p> #data <!doctype html><svg><title>abc #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | <svg title> | "abc" #data <option><span><option> #errors #document | <html> | <head> | <body> | <option> | <span> | <option> #data <option><option> #errors #document | <html> | <head> | <body> | <option> | <option> #data <math><annotation-xml><div> #errors #document | <html> | <head> | <body> | <math math> | <math annotation-xml> | <div> #data <math><annotation-xml encoding="application/svg+xml"><div> #errors #document | <html> | <head> | <body> | <math math> | <math annotation-xml> | encoding="application/svg+xml" | <div> #data <math><annotation-xml encoding="application/xhtml+xml"><div> #errors #document | <html> | <head> | <body> | <math math> | <math annotation-xml> | encoding="application/xhtml+xml" | <div> #data <math><annotation-xml encoding="aPPlication/xhtmL+xMl"><div> #errors #document | <html> | <head> | <body> | <math math> | <math annotation-xml> | encoding="aPPlication/xhtmL+xMl" | <div> #data <math><annotation-xml encoding="text/html"><div> #errors #document | <html> | <head> | <body> | <math math> | <math annotation-xml> | encoding="text/html" | <div> #data <math><annotation-xml encoding="Text/htmL"><div> #errors #document | <html> | <head> | <body> | <math math> | <math annotation-xml> | encoding="Text/htmL" | <div> #data <math><annotation-xml encoding=" text/html "><div> #errors #document | <html> | <head> | <body> | <math math> | <math annotation-xml> | encoding=" text/html " | <div> ����������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests1.dat��������������������������������������������������������������0000644�0001751�0001751�00000152434�12235217213�017312� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data Test #errors Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. #document | <html> | <head> | <body> | "Test" #data <p>One<p>Two #errors Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. #document | <html> | <head> | <body> | <p> | "One" | <p> | "Two" #data Line1<br>Line2<br>Line3<br>Line4 #errors Line: 1 Col: 5 Unexpected non-space characters. Expected DOCTYPE. #document | <html> | <head> | <body> | "Line1" | <br> | "Line2" | <br> | "Line3" | <br> | "Line4" #data <html> #errors Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. #document | <html> | <head> | <body> #data <head> #errors Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. #document | <html> | <head> | <body> #data <body> #errors Line: 1 Col: 6 Unexpected start tag (body). Expected DOCTYPE. #document | <html> | <head> | <body> #data <html><head> #errors Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. #document | <html> | <head> | <body> #data <html><head></head> #errors Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. #document | <html> | <head> | <body> #data <html><head></head><body> #errors Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. #document | <html> | <head> | <body> #data <html><head></head><body></body> #errors Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. #document | <html> | <head> | <body> #data <html><head><body></body></html> #errors Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. #document | <html> | <head> | <body> #data <html><head></body></html> #errors Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. Line: 1 Col: 19 Unexpected end tag (body). Line: 1 Col: 26 Unexpected end tag (html). #document | <html> | <head> | <body> #data <html><head><body></html> #errors Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. #document | <html> | <head> | <body> #data <html><body></html> #errors Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. #document | <html> | <head> | <body> #data <body></html> #errors Line: 1 Col: 6 Unexpected start tag (body). Expected DOCTYPE. #document | <html> | <head> | <body> #data <head></html> #errors Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. Line: 1 Col: 13 Unexpected end tag (html). Ignored. #document | <html> | <head> | <body> #data </head> #errors Line: 1 Col: 7 Unexpected end tag (head). Expected DOCTYPE. #document | <html> | <head> | <body> #data </body> #errors Line: 1 Col: 7 Unexpected end tag (body). Expected DOCTYPE. Line: 1 Col: 7 Unexpected end tag (body) after the (implied) root element. #document | <html> | <head> | <body> #data </html> #errors Line: 1 Col: 7 Unexpected end tag (html). Expected DOCTYPE. Line: 1 Col: 7 Unexpected end tag (html) after the (implied) root element. #document | <html> | <head> | <body> #data <b><table><td><i></table> #errors Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase. Line: 1 Col: 25 Got table cell end tag (td) while required end tags are missing. Line: 1 Col: 25 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <b> | <table> | <tbody> | <tr> | <td> | <i> #data <b><table><td></b><i></table>X #errors Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase. Line: 1 Col: 18 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 29 Got table cell end tag (td) while required end tags are missing. Line: 1 Col: 30 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <b> | <table> | <tbody> | <tr> | <td> | <i> | "X" #data <h1>Hello<h2>World #errors 4: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. 13: Heading cannot be a child of another heading. 18: End of file seen and there were open elements. #document | <html> | <head> | <body> | <h1> | "Hello" | <h2> | "World" #data <a><p>X<a>Y</a>Z</p></a> #errors Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE. Line: 1 Col: 10 Unexpected start tag (a) implies end tag (a). Line: 1 Col: 10 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 24 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. #document | <html> | <head> | <body> | <a> | <p> | <a> | "X" | <a> | "Y" | "Z" #data <b><button>foo</b>bar #errors Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. Line: 1 Col: 15 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. #document | <html> | <head> | <body> | <b> | <button> | <b> | "foo" | "bar" #data <!DOCTYPE html><span><button>foo</span>bar #errors 39: End tag “span” seen but there were unclosed elements. #document | <!DOCTYPE html> | <html> | <head> | <body> | <span> | <button> | "foobar" #data <p><b><div><marquee></p></b></div>X #errors Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. Line: 1 Col: 11 Unexpected end tag (p). Ignored. Line: 1 Col: 24 Unexpected end tag (p). Ignored. Line: 1 Col: 28 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 34 End tag (div) seen too early. Expected other end tag. Line: 1 Col: 35 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <p> | <b> | <div> | <b> | <marquee> | <p> | "X" #data <script><div></script></div><title><p></title><p><p> #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 28 Unexpected end tag (div). Ignored. #document | <html> | <head> | <script> | "<div>" | <title> | "<p>" | <body> | <p> | <p> #data <!--><div>--<!--> #errors Line: 1 Col: 5 Incorrect comment. Line: 1 Col: 10 Unexpected start tag (div). Expected DOCTYPE. Line: 1 Col: 17 Incorrect comment. Line: 1 Col: 17 Expected closing tag. Unexpected end of file. #document | <!-- --> | <html> | <head> | <body> | <div> | "--" | <!-- --> #data <p><hr></p> #errors Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. Line: 1 Col: 11 Unexpected end tag (p). Ignored. #document | <html> | <head> | <body> | <p> | <hr> | <p> #data <select><b><option><select><option></b></select>X #errors Line: 1 Col: 8 Unexpected start tag (select). Expected DOCTYPE. Line: 1 Col: 11 Unexpected start tag token (b) in the select phase. Ignored. Line: 1 Col: 27 Unexpected select start tag in the select phase treated as select end tag. Line: 1 Col: 39 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 48 Unexpected end tag (select). Ignored. Line: 1 Col: 49 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <select> | <option> | <option> | "X" #data <a><table><td><a><table></table><a></tr><a></table><b>X</b>C<a>Y #errors Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE. Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase. Line: 1 Col: 35 Unexpected start tag (a) implies end tag (a). Line: 1 Col: 40 Got table cell end tag (td) while required end tags are missing. Line: 1 Col: 43 Unexpected start tag (a) in table context caused voodoo mode. Line: 1 Col: 43 Unexpected start tag (a) implies end tag (a). Line: 1 Col: 43 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 51 Unexpected implied end tag (a) in the table phase. Line: 1 Col: 63 Unexpected start tag (a) implies end tag (a). Line: 1 Col: 64 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <a> | <a> | <table> | <tbody> | <tr> | <td> | <a> | <table> | <a> | <a> | <b> | "X" | "C" | <a> | "Y" #data <a X>0<b>1<a Y>2 #errors Line: 1 Col: 5 Unexpected start tag (a). Expected DOCTYPE. Line: 1 Col: 15 Unexpected start tag (a) implies end tag (a). Line: 1 Col: 15 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 16 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <a> | x="" | "0" | <b> | "1" | <b> | <a> | y="" | "2" #data <!-----><font><div>hello<table>excite!<b>me!<th><i>please!</tr><!--X--> #errors Line: 1 Col: 7 Unexpected '-' after '--' found in comment. Line: 1 Col: 14 Unexpected start tag (font). Expected DOCTYPE. Line: 1 Col: 38 Unexpected non-space characters in table context caused voodoo mode. Line: 1 Col: 41 Unexpected start tag (b) in table context caused voodoo mode. Line: 1 Col: 48 Unexpected implied end tag (b) in the table phase. Line: 1 Col: 48 Unexpected table cell start tag (th) in the table body phase. Line: 1 Col: 63 Got table cell end tag (th) while required end tags are missing. Line: 1 Col: 71 Unexpected end of file. Expected table content. #document | <!-- - --> | <html> | <head> | <body> | <font> | <div> | "helloexcite!" | <b> | "me!" | <table> | <tbody> | <tr> | <th> | <i> | "please!" | <!-- X --> #data <!DOCTYPE html><li>hello<li>world<ul>how<li>do</ul>you</body><!--do--> #errors Line: 1 Col: 61 Unexpected end tag (li). Missing end tag (body). #document | <!DOCTYPE html> | <html> | <head> | <body> | <li> | "hello" | <li> | "world" | <ul> | "how" | <li> | "do" | "you" | <!-- do --> #data <!DOCTYPE html>A<option>B<optgroup>C<select>D</option>E #errors Line: 1 Col: 54 Unexpected end tag (option) in the select phase. Ignored. Line: 1 Col: 55 Expected closing tag. Unexpected end of file. #document | <!DOCTYPE html> | <html> | <head> | <body> | "A" | <option> | "B" | <optgroup> | "C" | <select> | "DE" #data < #errors Line: 1 Col: 1 Expected tag name. Got something else instead Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. #document | <html> | <head> | <body> | "<" #data <# #errors Line: 1 Col: 1 Expected tag name. Got something else instead Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. #document | <html> | <head> | <body> | "<#" #data </ #errors Line: 1 Col: 2 Expected closing tag. Unexpected end of file. Line: 1 Col: 2 Unexpected non-space characters. Expected DOCTYPE. #document | <html> | <head> | <body> | "</" #data </# #errors Line: 1 Col: 2 Expected closing tag. Unexpected character '#' found. Line: 1 Col: 3 Unexpected End of file. Expected DOCTYPE. #document | <!-- # --> | <html> | <head> | <body> #data <? #errors Line: 1 Col: 1 Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.) Line: 1 Col: 2 Unexpected End of file. Expected DOCTYPE. #document | <!-- ? --> | <html> | <head> | <body> #data <?# #errors Line: 1 Col: 1 Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.) Line: 1 Col: 3 Unexpected End of file. Expected DOCTYPE. #document | <!-- ?# --> | <html> | <head> | <body> #data <! #errors Line: 1 Col: 2 Expected '--' or 'DOCTYPE'. Not found. Line: 1 Col: 2 Unexpected End of file. Expected DOCTYPE. #document | <!-- --> | <html> | <head> | <body> #data <!# #errors Line: 1 Col: 3 Expected '--' or 'DOCTYPE'. Not found. Line: 1 Col: 3 Unexpected End of file. Expected DOCTYPE. #document | <!-- # --> | <html> | <head> | <body> #data <?COMMENT?> #errors Line: 1 Col: 1 Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.) Line: 1 Col: 11 Unexpected End of file. Expected DOCTYPE. #document | <!-- ?COMMENT? --> | <html> | <head> | <body> #data <!COMMENT> #errors Line: 1 Col: 2 Expected '--' or 'DOCTYPE'. Not found. Line: 1 Col: 10 Unexpected End of file. Expected DOCTYPE. #document | <!-- COMMENT --> | <html> | <head> | <body> #data </ COMMENT > #errors Line: 1 Col: 2 Expected closing tag. Unexpected character ' ' found. Line: 1 Col: 12 Unexpected End of file. Expected DOCTYPE. #document | <!-- COMMENT --> | <html> | <head> | <body> #data <?COM--MENT?> #errors Line: 1 Col: 1 Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.) Line: 1 Col: 13 Unexpected End of file. Expected DOCTYPE. #document | <!-- ?COM--MENT? --> | <html> | <head> | <body> #data <!COM--MENT> #errors Line: 1 Col: 2 Expected '--' or 'DOCTYPE'. Not found. Line: 1 Col: 12 Unexpected End of file. Expected DOCTYPE. #document | <!-- COM--MENT --> | <html> | <head> | <body> #data </ COM--MENT > #errors Line: 1 Col: 2 Expected closing tag. Unexpected character ' ' found. Line: 1 Col: 14 Unexpected End of file. Expected DOCTYPE. #document | <!-- COM--MENT --> | <html> | <head> | <body> #data <!DOCTYPE html><style> EOF #errors Line: 1 Col: 26 Unexpected end of file. Expected end tag (style). #document | <!DOCTYPE html> | <html> | <head> | <style> | " EOF" | <body> #data <!DOCTYPE html><script> <!-- </script> --> </script> EOF #errors #document | <!DOCTYPE html> | <html> | <head> | <script> | " <!-- " | " " | <body> | "--> EOF" #data <b><p></b>TEST #errors Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. Line: 1 Col: 10 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. #document | <html> | <head> | <body> | <b> | <p> | <b> | "TEST" #data <p id=a><b><p id=b></b>TEST #errors Line: 1 Col: 8 Unexpected start tag (p). Expected DOCTYPE. Line: 1 Col: 19 Unexpected end tag (p). Ignored. Line: 1 Col: 23 End tag (b) violates step 1, paragraph 2 of the adoption agency algorithm. #document | <html> | <head> | <body> | <p> | id="a" | <b> | <p> | id="b" | "TEST" #data <b id=a><p><b id=b></p></b>TEST #errors Line: 1 Col: 8 Unexpected start tag (b). Expected DOCTYPE. Line: 1 Col: 23 Unexpected end tag (p). Ignored. Line: 1 Col: 27 End tag (b) violates step 1, paragraph 2 of the adoption agency algorithm. Line: 1 Col: 31 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <b> | id="a" | <p> | <b> | id="b" | "TEST" #data <!DOCTYPE html><title>U-test</title><body><div><p>Test<u></p></div></body> #errors Line: 1 Col: 61 Unexpected end tag (p). Ignored. #document | <!DOCTYPE html> | <html> | <head> | <title> | "U-test" | <body> | <div> | <p> | "Test" | <u> #data <!DOCTYPE html><font><table></font></table></font> #errors Line: 1 Col: 35 Unexpected end tag (font) in table context caused voodoo mode. Line: 1 Col: 35 End tag (font) violates step 1, paragraph 1 of the adoption agency algorithm. #document | <!DOCTYPE html> | <html> | <head> | <body> | <font> | <table> #data <font><p>hello<b>cruel</font>world #errors Line: 1 Col: 6 Unexpected start tag (font). Expected DOCTYPE. Line: 1 Col: 29 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 29 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 34 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <font> | <p> | <font> | "hello" | <b> | "cruel" | <b> | "world" #data <b>Test</i>Test #errors Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. Line: 1 Col: 11 End tag (i) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 15 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <b> | "TestTest" #data <b>A<cite>B<div>C #errors Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. Line: 1 Col: 17 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <b> | "A" | <cite> | "B" | <div> | "C" #data <b>A<cite>B<div>C</cite>D #errors Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. Line: 1 Col: 24 Unexpected end tag (cite). Ignored. Line: 1 Col: 25 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <b> | "A" | <cite> | "B" | <div> | "CD" #data <b>A<cite>B<div>C</b>D #errors Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. Line: 1 Col: 21 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 22 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <b> | "A" | <cite> | "B" | <div> | <b> | "C" | "D" #data #errors Line: 1 Col: 0 Unexpected End of file. Expected DOCTYPE. #document | <html> | <head> | <body> #data <DIV> #errors Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. Line: 1 Col: 5 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> #data <DIV> abc #errors Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. Line: 1 Col: 9 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> | " abc" #data <DIV> abc <B> #errors Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. Line: 1 Col: 13 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> | " abc " | <b> #data <DIV> abc <B> def #errors Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. Line: 1 Col: 17 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> | " abc " | <b> | " def" #data <DIV> abc <B> def <I> #errors Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. Line: 1 Col: 21 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> | " abc " | <b> | " def " | <i> #data <DIV> abc <B> def <I> ghi #errors Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. Line: 1 Col: 25 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> | " abc " | <b> | " def " | <i> | " ghi" #data <DIV> abc <B> def <I> ghi <P> #errors Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. Line: 1 Col: 29 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> | " abc " | <b> | " def " | <i> | " ghi " | <p> #data <DIV> abc <B> def <I> ghi <P> jkl #errors Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. Line: 1 Col: 33 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> | " abc " | <b> | " def " | <i> | " ghi " | <p> | " jkl" #data <DIV> abc <B> def <I> ghi <P> jkl </B> #errors Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 38 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> | " abc " | <b> | " def " | <i> | " ghi " | <i> | <p> | <b> | " jkl " #data <DIV> abc <B> def <I> ghi <P> jkl </B> mno #errors Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 42 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> | " abc " | <b> | " def " | <i> | " ghi " | <i> | <p> | <b> | " jkl " | " mno" #data <DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> #errors Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 47 End tag (i) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 47 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> | " abc " | <b> | " def " | <i> | " ghi " | <i> | <p> | <i> | <b> | " jkl " | " mno " #data <DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr #errors Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 47 End tag (i) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 51 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> | " abc " | <b> | " def " | <i> | " ghi " | <i> | <p> | <i> | <b> | " jkl " | " mno " | " pqr" #data <DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr </P> #errors Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 47 End tag (i) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 56 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> | " abc " | <b> | " def " | <i> | " ghi " | <i> | <p> | <i> | <b> | " jkl " | " mno " | " pqr " #data <DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr </P> stu #errors Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 47 End tag (i) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 60 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <div> | " abc " | <b> | " def " | <i> | " ghi " | <i> | <p> | <i> | <b> | " jkl " | " mno " | " pqr " | " stu" #data <test attribute----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> #errors Line: 1 Col: 1040 Unexpected start tag (test). Expected DOCTYPE. Line: 1 Col: 1040 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <test> | attribute----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------="" #data <a href="blah">aba<table><a href="foo">br<tr><td></td></tr>x</table>aoe #errors Line: 1 Col: 15 Unexpected start tag (a). Expected DOCTYPE. Line: 1 Col: 39 Unexpected start tag (a) in table context caused voodoo mode. Line: 1 Col: 39 Unexpected start tag (a) implies end tag (a). Line: 1 Col: 39 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 45 Unexpected implied end tag (a) in the table phase. Line: 1 Col: 68 Unexpected implied end tag (a) in the table phase. Line: 1 Col: 71 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <a> | href="blah" | "aba" | <a> | href="foo" | "br" | <a> | href="foo" | "x" | <table> | <tbody> | <tr> | <td> | <a> | href="foo" | "aoe" #data <a href="blah">aba<table><tr><td><a href="foo">br</td></tr>x</table>aoe #errors Line: 1 Col: 15 Unexpected start tag (a). Expected DOCTYPE. Line: 1 Col: 54 Got table cell end tag (td) while required end tags are missing. Line: 1 Col: 60 Unexpected non-space characters in table context caused voodoo mode. Line: 1 Col: 71 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <a> | href="blah" | "abax" | <table> | <tbody> | <tr> | <td> | <a> | href="foo" | "br" | "aoe" #data <table><a href="blah">aba<tr><td><a href="foo">br</td></tr>x</table>aoe #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 22 Unexpected start tag (a) in table context caused voodoo mode. Line: 1 Col: 29 Unexpected implied end tag (a) in the table phase. Line: 1 Col: 54 Got table cell end tag (td) while required end tags are missing. Line: 1 Col: 68 Unexpected implied end tag (a) in the table phase. Line: 1 Col: 71 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <a> | href="blah" | "aba" | <a> | href="blah" | "x" | <table> | <tbody> | <tr> | <td> | <a> | href="foo" | "br" | <a> | href="blah" | "aoe" #data <a href=a>aa<marquee>aa<a href=b>bb</marquee>aa #errors Line: 1 Col: 10 Unexpected start tag (a). Expected DOCTYPE. Line: 1 Col: 45 End tag (marquee) seen too early. Expected other end tag. Line: 1 Col: 47 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <a> | href="a" | "aa" | <marquee> | "aa" | <a> | href="b" | "bb" | "aa" #data <wbr><strike><code></strike><code><strike></code> #errors Line: 1 Col: 5 Unexpected start tag (wbr). Expected DOCTYPE. Line: 1 Col: 28 End tag (strike) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 49 Unexpected end tag (code). Ignored. #document | <html> | <head> | <body> | <wbr> | <strike> | <code> | <code> | <code> | <strike> #data <!DOCTYPE html><spacer>foo #errors 26: End of file seen and there were open elements. #document | <!DOCTYPE html> | <html> | <head> | <body> | <spacer> | "foo" #data <title><meta></title><link><title><meta></title> #errors Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. #document | <html> | <head> | <title> | "<meta>" | <link> | <title> | "<meta>" | <body> #data <style><!--</style><meta><script>--><link></script> #errors Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. Line: 1 Col: 51 Unexpected end of file. Expected end tag (style). #document | <html> | <head> | <style> | "<!--" | <meta> | <script> | "--><link>" | <body> #data <head><meta></head><link> #errors Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. Line: 1 Col: 25 Unexpected start tag (link) that can be in head. Moved. #document | <html> | <head> | <meta> | <link> | <body> #data <table><tr><tr><td><td><span><th><span>X</table> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 33 Got table cell end tag (td) while required end tags are missing. Line: 1 Col: 48 Got table cell end tag (th) while required end tags are missing. #document | <html> | <head> | <body> | <table> | <tbody> | <tr> | <tr> | <td> | <td> | <span> | <th> | <span> | "X" #data <body><body><base><link><meta><title><p></title><body><p></body> #errors Line: 1 Col: 6 Unexpected start tag (body). Expected DOCTYPE. Line: 1 Col: 12 Unexpected start tag (body). Line: 1 Col: 54 Unexpected start tag (body). Line: 1 Col: 64 Unexpected end tag (p). Missing end tag (body). #document | <html> | <head> | <body> | <base> | <link> | <meta> | <title> | "<p>" | <p> #data <textarea><p></textarea> #errors Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. #document | <html> | <head> | <body> | <textarea> | "<p>" #data <p><image></p> #errors Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. Line: 1 Col: 10 Unexpected start tag (image). Treated as img. #document | <html> | <head> | <body> | <p> | <img> #data <a><table><a></table><p><a><div><a> #errors Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE. Line: 1 Col: 13 Unexpected start tag (a) in table context caused voodoo mode. Line: 1 Col: 13 Unexpected start tag (a) implies end tag (a). Line: 1 Col: 13 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 21 Unexpected end tag (table). Expected end tag (a). Line: 1 Col: 27 Unexpected start tag (a) implies end tag (a). Line: 1 Col: 27 End tag (a) violates step 1, paragraph 2 of the adoption agency algorithm. Line: 1 Col: 32 Unexpected end tag (p). Ignored. Line: 1 Col: 35 Unexpected start tag (a) implies end tag (a). Line: 1 Col: 35 End tag (a) violates step 1, paragraph 2 of the adoption agency algorithm. Line: 1 Col: 35 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <a> | <a> | <table> | <p> | <a> | <div> | <a> #data <head></p><meta><p> #errors Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. Line: 1 Col: 10 Unexpected end tag (p). Ignored. #document | <html> | <head> | <meta> | <body> | <p> #data <head></html><meta><p> #errors Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. Line: 1 Col: 19 Unexpected start tag (meta). #document | <html> | <head> | <body> | <meta> | <p> #data <b><table><td><i></table> #errors Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase. Line: 1 Col: 25 Got table cell end tag (td) while required end tags are missing. Line: 1 Col: 25 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <b> | <table> | <tbody> | <tr> | <td> | <i> #data <b><table><td></b><i></table> #errors Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase. Line: 1 Col: 18 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 29 Got table cell end tag (td) while required end tags are missing. Line: 1 Col: 29 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <b> | <table> | <tbody> | <tr> | <td> | <i> #data <h1><h2> #errors 4: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. 8: Heading cannot be a child of another heading. 8: End of file seen and there were open elements. #document | <html> | <head> | <body> | <h1> | <h2> #data <a><p><a></a></p></a> #errors Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE. Line: 1 Col: 9 Unexpected start tag (a) implies end tag (a). Line: 1 Col: 9 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 21 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. #document | <html> | <head> | <body> | <a> | <p> | <a> | <a> #data <b><button></b></button></b> #errors Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. Line: 1 Col: 15 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. #document | <html> | <head> | <body> | <b> | <button> | <b> #data <p><b><div><marquee></p></b></div> #errors Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. Line: 1 Col: 11 Unexpected end tag (p). Ignored. Line: 1 Col: 24 Unexpected end tag (p). Ignored. Line: 1 Col: 28 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 34 End tag (div) seen too early. Expected other end tag. Line: 1 Col: 34 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <p> | <b> | <div> | <b> | <marquee> | <p> #data <script></script></div><title></title><p><p> #errors Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. Line: 1 Col: 23 Unexpected end tag (div). Ignored. #document | <html> | <head> | <script> | <title> | <body> | <p> | <p> #data <p><hr></p> #errors Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. Line: 1 Col: 11 Unexpected end tag (p). Ignored. #document | <html> | <head> | <body> | <p> | <hr> | <p> #data <select><b><option><select><option></b></select> #errors Line: 1 Col: 8 Unexpected start tag (select). Expected DOCTYPE. Line: 1 Col: 11 Unexpected start tag token (b) in the select phase. Ignored. Line: 1 Col: 27 Unexpected select start tag in the select phase treated as select end tag. Line: 1 Col: 39 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 48 Unexpected end tag (select). Ignored. Line: 1 Col: 48 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <select> | <option> | <option> #data <html><head><title></title><body></body></html> #errors Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. #document | <html> | <head> | <title> | <body> #data <a><table><td><a><table></table><a></tr><a></table><a> #errors Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE. Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase. Line: 1 Col: 35 Unexpected start tag (a) implies end tag (a). Line: 1 Col: 40 Got table cell end tag (td) while required end tags are missing. Line: 1 Col: 43 Unexpected start tag (a) in table context caused voodoo mode. Line: 1 Col: 43 Unexpected start tag (a) implies end tag (a). Line: 1 Col: 43 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 51 Unexpected implied end tag (a) in the table phase. Line: 1 Col: 54 Unexpected start tag (a) implies end tag (a). Line: 1 Col: 54 End tag (a) violates step 1, paragraph 2 of the adoption agency algorithm. Line: 1 Col: 54 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <a> | <a> | <table> | <tbody> | <tr> | <td> | <a> | <table> | <a> | <a> #data <ul><li></li><div><li></div><li><li><div><li><address><li><b><em></b><li></ul> #errors Line: 1 Col: 4 Unexpected start tag (ul). Expected DOCTYPE. Line: 1 Col: 45 Missing end tag (div, li). Line: 1 Col: 58 Missing end tag (address, li). Line: 1 Col: 69 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. #document | <html> | <head> | <body> | <ul> | <li> | <div> | <li> | <li> | <li> | <div> | <li> | <address> | <li> | <b> | <em> | <li> #data <ul><li><ul></li><li>a</li></ul></li></ul> #errors XXX: fix me #document | <html> | <head> | <body> | <ul> | <li> | <ul> | <li> | "a" #data <frameset><frame><frameset><frame></frameset><noframes></noframes></frameset> #errors Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. #document | <html> | <head> | <frameset> | <frame> | <frameset> | <frame> | <noframes> #data <h1><table><td><h3></table><h3></h1> #errors 4: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. 15: “td” start tag in table body. 27: Unclosed elements. 31: Heading cannot be a child of another heading. 36: End tag “h1” seen but there were unclosed elements. #document | <html> | <head> | <body> | <h1> | <table> | <tbody> | <tr> | <td> | <h3> | <h3> #data <table><colgroup><col><colgroup><col><col><col><colgroup><col><col><thead><tr><td></table> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. #document | <html> | <head> | <body> | <table> | <colgroup> | <col> | <colgroup> | <col> | <col> | <col> | <colgroup> | <col> | <col> | <thead> | <tr> | <td> #data <table><col><tbody><col><tr><col><td><col></table><col> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 37 Unexpected table cell start tag (td) in the table body phase. Line: 1 Col: 55 Unexpected start tag col. Ignored. #document | <html> | <head> | <body> | <table> | <colgroup> | <col> | <tbody> | <colgroup> | <col> | <tbody> | <tr> | <colgroup> | <col> | <tbody> | <tr> | <td> | <colgroup> | <col> #data <table><colgroup><tbody><colgroup><tr><colgroup><td><colgroup></table><colgroup> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 52 Unexpected table cell start tag (td) in the table body phase. Line: 1 Col: 80 Unexpected start tag colgroup. Ignored. #document | <html> | <head> | <body> | <table> | <colgroup> | <tbody> | <colgroup> | <tbody> | <tr> | <colgroup> | <tbody> | <tr> | <td> | <colgroup> #data </strong></b></em></i></u></strike></s></blink></tt></pre></big></small></font></select></h1></h2></h3></h4></h5></h6></body></br></a></img></title></span></style></script></table></th></td></tr></frame></area></link></param></hr></input></col></base></meta></basefont></bgsound></embed></spacer></p></dd></dt></caption></colgroup></tbody></tfoot></thead></address></blockquote></center></dir></div></dl></fieldset></listing></menu></ol></ul></li></nobr></wbr></form></button></marquee></object></html></frameset></head></iframe></image></isindex></noembed></noframes></noscript></optgroup></option></plaintext></textarea> #errors Line: 1 Col: 9 Unexpected end tag (strong). Expected DOCTYPE. Line: 1 Col: 9 Unexpected end tag (strong) after the (implied) root element. Line: 1 Col: 13 Unexpected end tag (b) after the (implied) root element. Line: 1 Col: 18 Unexpected end tag (em) after the (implied) root element. Line: 1 Col: 22 Unexpected end tag (i) after the (implied) root element. Line: 1 Col: 26 Unexpected end tag (u) after the (implied) root element. Line: 1 Col: 35 Unexpected end tag (strike) after the (implied) root element. Line: 1 Col: 39 Unexpected end tag (s) after the (implied) root element. Line: 1 Col: 47 Unexpected end tag (blink) after the (implied) root element. Line: 1 Col: 52 Unexpected end tag (tt) after the (implied) root element. Line: 1 Col: 58 Unexpected end tag (pre) after the (implied) root element. Line: 1 Col: 64 Unexpected end tag (big) after the (implied) root element. Line: 1 Col: 72 Unexpected end tag (small) after the (implied) root element. Line: 1 Col: 79 Unexpected end tag (font) after the (implied) root element. Line: 1 Col: 88 Unexpected end tag (select) after the (implied) root element. Line: 1 Col: 93 Unexpected end tag (h1) after the (implied) root element. Line: 1 Col: 98 Unexpected end tag (h2) after the (implied) root element. Line: 1 Col: 103 Unexpected end tag (h3) after the (implied) root element. Line: 1 Col: 108 Unexpected end tag (h4) after the (implied) root element. Line: 1 Col: 113 Unexpected end tag (h5) after the (implied) root element. Line: 1 Col: 118 Unexpected end tag (h6) after the (implied) root element. Line: 1 Col: 125 Unexpected end tag (body) after the (implied) root element. Line: 1 Col: 130 Unexpected end tag (br). Treated as br element. Line: 1 Col: 134 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 140 This element (img) has no end tag. Line: 1 Col: 148 Unexpected end tag (title). Ignored. Line: 1 Col: 155 Unexpected end tag (span). Ignored. Line: 1 Col: 163 Unexpected end tag (style). Ignored. Line: 1 Col: 172 Unexpected end tag (script). Ignored. Line: 1 Col: 180 Unexpected end tag (table). Ignored. Line: 1 Col: 185 Unexpected end tag (th). Ignored. Line: 1 Col: 190 Unexpected end tag (td). Ignored. Line: 1 Col: 195 Unexpected end tag (tr). Ignored. Line: 1 Col: 203 This element (frame) has no end tag. Line: 1 Col: 210 This element (area) has no end tag. Line: 1 Col: 217 Unexpected end tag (link). Ignored. Line: 1 Col: 225 This element (param) has no end tag. Line: 1 Col: 230 This element (hr) has no end tag. Line: 1 Col: 238 This element (input) has no end tag. Line: 1 Col: 244 Unexpected end tag (col). Ignored. Line: 1 Col: 251 Unexpected end tag (base). Ignored. Line: 1 Col: 258 Unexpected end tag (meta). Ignored. Line: 1 Col: 269 This element (basefont) has no end tag. Line: 1 Col: 279 This element (bgsound) has no end tag. Line: 1 Col: 287 This element (embed) has no end tag. Line: 1 Col: 296 This element (spacer) has no end tag. Line: 1 Col: 300 Unexpected end tag (p). Ignored. Line: 1 Col: 305 End tag (dd) seen too early. Expected other end tag. Line: 1 Col: 310 End tag (dt) seen too early. Expected other end tag. Line: 1 Col: 320 Unexpected end tag (caption). Ignored. Line: 1 Col: 331 Unexpected end tag (colgroup). Ignored. Line: 1 Col: 339 Unexpected end tag (tbody). Ignored. Line: 1 Col: 347 Unexpected end tag (tfoot). Ignored. Line: 1 Col: 355 Unexpected end tag (thead). Ignored. Line: 1 Col: 365 End tag (address) seen too early. Expected other end tag. Line: 1 Col: 378 End tag (blockquote) seen too early. Expected other end tag. Line: 1 Col: 387 End tag (center) seen too early. Expected other end tag. Line: 1 Col: 393 Unexpected end tag (dir). Ignored. Line: 1 Col: 399 End tag (div) seen too early. Expected other end tag. Line: 1 Col: 404 End tag (dl) seen too early. Expected other end tag. Line: 1 Col: 415 End tag (fieldset) seen too early. Expected other end tag. Line: 1 Col: 425 End tag (listing) seen too early. Expected other end tag. Line: 1 Col: 432 End tag (menu) seen too early. Expected other end tag. Line: 1 Col: 437 End tag (ol) seen too early. Expected other end tag. Line: 1 Col: 442 End tag (ul) seen too early. Expected other end tag. Line: 1 Col: 447 End tag (li) seen too early. Expected other end tag. Line: 1 Col: 454 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 460 This element (wbr) has no end tag. Line: 1 Col: 476 End tag (button) seen too early. Expected other end tag. Line: 1 Col: 486 End tag (marquee) seen too early. Expected other end tag. Line: 1 Col: 495 End tag (object) seen too early. Expected other end tag. Line: 1 Col: 513 Unexpected end tag (html). Ignored. Line: 1 Col: 513 Unexpected end tag (frameset). Ignored. Line: 1 Col: 520 Unexpected end tag (head). Ignored. Line: 1 Col: 529 Unexpected end tag (iframe). Ignored. Line: 1 Col: 537 This element (image) has no end tag. Line: 1 Col: 547 This element (isindex) has no end tag. Line: 1 Col: 557 Unexpected end tag (noembed). Ignored. Line: 1 Col: 568 Unexpected end tag (noframes). Ignored. Line: 1 Col: 579 Unexpected end tag (noscript). Ignored. Line: 1 Col: 590 Unexpected end tag (optgroup). Ignored. Line: 1 Col: 599 Unexpected end tag (option). Ignored. Line: 1 Col: 611 Unexpected end tag (plaintext). Ignored. Line: 1 Col: 622 Unexpected end tag (textarea). Ignored. #document | <html> | <head> | <body> | <br> | <p> #data <table><tr></strong></b></em></i></u></strike></s></blink></tt></pre></big></small></font></select></h1></h2></h3></h4></h5></h6></body></br></a></img></title></span></style></script></table></th></td></tr></frame></area></link></param></hr></input></col></base></meta></basefont></bgsound></embed></spacer></p></dd></dt></caption></colgroup></tbody></tfoot></thead></address></blockquote></center></dir></div></dl></fieldset></listing></menu></ol></ul></li></nobr></wbr></form></button></marquee></object></html></frameset></head></iframe></image></isindex></noembed></noframes></noscript></optgroup></option></plaintext></textarea> #errors Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. Line: 1 Col: 20 Unexpected end tag (strong) in table context caused voodoo mode. Line: 1 Col: 20 End tag (strong) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 24 Unexpected end tag (b) in table context caused voodoo mode. Line: 1 Col: 24 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 29 Unexpected end tag (em) in table context caused voodoo mode. Line: 1 Col: 29 End tag (em) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 33 Unexpected end tag (i) in table context caused voodoo mode. Line: 1 Col: 33 End tag (i) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 37 Unexpected end tag (u) in table context caused voodoo mode. Line: 1 Col: 37 End tag (u) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 46 Unexpected end tag (strike) in table context caused voodoo mode. Line: 1 Col: 46 End tag (strike) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 50 Unexpected end tag (s) in table context caused voodoo mode. Line: 1 Col: 50 End tag (s) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 58 Unexpected end tag (blink) in table context caused voodoo mode. Line: 1 Col: 58 Unexpected end tag (blink). Ignored. Line: 1 Col: 63 Unexpected end tag (tt) in table context caused voodoo mode. Line: 1 Col: 63 End tag (tt) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 69 Unexpected end tag (pre) in table context caused voodoo mode. Line: 1 Col: 69 End tag (pre) seen too early. Expected other end tag. Line: 1 Col: 75 Unexpected end tag (big) in table context caused voodoo mode. Line: 1 Col: 75 End tag (big) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 83 Unexpected end tag (small) in table context caused voodoo mode. Line: 1 Col: 83 End tag (small) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 90 Unexpected end tag (font) in table context caused voodoo mode. Line: 1 Col: 90 End tag (font) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 99 Unexpected end tag (select) in table context caused voodoo mode. Line: 1 Col: 99 Unexpected end tag (select). Ignored. Line: 1 Col: 104 Unexpected end tag (h1) in table context caused voodoo mode. Line: 1 Col: 104 End tag (h1) seen too early. Expected other end tag. Line: 1 Col: 109 Unexpected end tag (h2) in table context caused voodoo mode. Line: 1 Col: 109 End tag (h2) seen too early. Expected other end tag. Line: 1 Col: 114 Unexpected end tag (h3) in table context caused voodoo mode. Line: 1 Col: 114 End tag (h3) seen too early. Expected other end tag. Line: 1 Col: 119 Unexpected end tag (h4) in table context caused voodoo mode. Line: 1 Col: 119 End tag (h4) seen too early. Expected other end tag. Line: 1 Col: 124 Unexpected end tag (h5) in table context caused voodoo mode. Line: 1 Col: 124 End tag (h5) seen too early. Expected other end tag. Line: 1 Col: 129 Unexpected end tag (h6) in table context caused voodoo mode. Line: 1 Col: 129 End tag (h6) seen too early. Expected other end tag. Line: 1 Col: 136 Unexpected end tag (body) in the table row phase. Ignored. Line: 1 Col: 141 Unexpected end tag (br) in table context caused voodoo mode. Line: 1 Col: 141 Unexpected end tag (br). Treated as br element. Line: 1 Col: 145 Unexpected end tag (a) in table context caused voodoo mode. Line: 1 Col: 145 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 151 Unexpected end tag (img) in table context caused voodoo mode. Line: 1 Col: 151 This element (img) has no end tag. Line: 1 Col: 159 Unexpected end tag (title) in table context caused voodoo mode. Line: 1 Col: 159 Unexpected end tag (title). Ignored. Line: 1 Col: 166 Unexpected end tag (span) in table context caused voodoo mode. Line: 1 Col: 166 Unexpected end tag (span). Ignored. Line: 1 Col: 174 Unexpected end tag (style) in table context caused voodoo mode. Line: 1 Col: 174 Unexpected end tag (style). Ignored. Line: 1 Col: 183 Unexpected end tag (script) in table context caused voodoo mode. Line: 1 Col: 183 Unexpected end tag (script). Ignored. Line: 1 Col: 196 Unexpected end tag (th). Ignored. Line: 1 Col: 201 Unexpected end tag (td). Ignored. Line: 1 Col: 206 Unexpected end tag (tr). Ignored. Line: 1 Col: 214 This element (frame) has no end tag. Line: 1 Col: 221 This element (area) has no end tag. Line: 1 Col: 228 Unexpected end tag (link). Ignored. Line: 1 Col: 236 This element (param) has no end tag. Line: 1 Col: 241 This element (hr) has no end tag. Line: 1 Col: 249 This element (input) has no end tag. Line: 1 Col: 255 Unexpected end tag (col). Ignored. Line: 1 Col: 262 Unexpected end tag (base). Ignored. Line: 1 Col: 269 Unexpected end tag (meta). Ignored. Line: 1 Col: 280 This element (basefont) has no end tag. Line: 1 Col: 290 This element (bgsound) has no end tag. Line: 1 Col: 298 This element (embed) has no end tag. Line: 1 Col: 307 This element (spacer) has no end tag. Line: 1 Col: 311 Unexpected end tag (p). Ignored. Line: 1 Col: 316 End tag (dd) seen too early. Expected other end tag. Line: 1 Col: 321 End tag (dt) seen too early. Expected other end tag. Line: 1 Col: 331 Unexpected end tag (caption). Ignored. Line: 1 Col: 342 Unexpected end tag (colgroup). Ignored. Line: 1 Col: 350 Unexpected end tag (tbody). Ignored. Line: 1 Col: 358 Unexpected end tag (tfoot). Ignored. Line: 1 Col: 366 Unexpected end tag (thead). Ignored. Line: 1 Col: 376 End tag (address) seen too early. Expected other end tag. Line: 1 Col: 389 End tag (blockquote) seen too early. Expected other end tag. Line: 1 Col: 398 End tag (center) seen too early. Expected other end tag. Line: 1 Col: 404 Unexpected end tag (dir). Ignored. Line: 1 Col: 410 End tag (div) seen too early. Expected other end tag. Line: 1 Col: 415 End tag (dl) seen too early. Expected other end tag. Line: 1 Col: 426 End tag (fieldset) seen too early. Expected other end tag. Line: 1 Col: 436 End tag (listing) seen too early. Expected other end tag. Line: 1 Col: 443 End tag (menu) seen too early. Expected other end tag. Line: 1 Col: 448 End tag (ol) seen too early. Expected other end tag. Line: 1 Col: 453 End tag (ul) seen too early. Expected other end tag. Line: 1 Col: 458 End tag (li) seen too early. Expected other end tag. Line: 1 Col: 465 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm. Line: 1 Col: 471 This element (wbr) has no end tag. Line: 1 Col: 487 End tag (button) seen too early. Expected other end tag. Line: 1 Col: 497 End tag (marquee) seen too early. Expected other end tag. Line: 1 Col: 506 End tag (object) seen too early. Expected other end tag. Line: 1 Col: 524 Unexpected end tag (html). Ignored. Line: 1 Col: 524 Unexpected end tag (frameset). Ignored. Line: 1 Col: 531 Unexpected end tag (head). Ignored. Line: 1 Col: 540 Unexpected end tag (iframe). Ignored. Line: 1 Col: 548 This element (image) has no end tag. Line: 1 Col: 558 This element (isindex) has no end tag. Line: 1 Col: 568 Unexpected end tag (noembed). Ignored. Line: 1 Col: 579 Unexpected end tag (noframes). Ignored. Line: 1 Col: 590 Unexpected end tag (noscript). Ignored. Line: 1 Col: 601 Unexpected end tag (optgroup). Ignored. Line: 1 Col: 610 Unexpected end tag (option). Ignored. Line: 1 Col: 622 Unexpected end tag (plaintext). Ignored. Line: 1 Col: 633 Unexpected end tag (textarea). Ignored. #document | <html> | <head> | <body> | <br> | <table> | <tbody> | <tr> | <p> #data <frameset> #errors Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. Line: 1 Col: 10 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <frameset> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests19.dat�������������������������������������������������������������0000644�0001751�0001751�00000042027�12235217213�017377� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <!doctype html><math><mn DefinitionUrl="foo"> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | <math mn> | definitionURL="foo" #data <!doctype html><html></p><!--foo--> #errors #document | <!DOCTYPE html> | <html> | <!-- foo --> | <head> | <body> #data <!doctype html><head></head></p><!--foo--> #errors #document | <!DOCTYPE html> | <html> | <head> | <!-- foo --> | <body> #data <!doctype html><body><p><pre> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <pre> #data <!doctype html><body><p><listing> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <listing> #data <!doctype html><p><plaintext> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <plaintext> #data <!doctype html><p><h1> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <h1> #data <!doctype html><form><isindex> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <form> #data <!doctype html><isindex action="POST"> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <form> | action="POST" | <hr> | <label> | "This is a searchable index. Enter search keywords: " | <input> | name="isindex" | <hr> #data <!doctype html><isindex prompt="this is isindex"> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <form> | <hr> | <label> | "this is isindex" | <input> | name="isindex" | <hr> #data <!doctype html><isindex type="hidden"> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <form> | <hr> | <label> | "This is a searchable index. Enter search keywords: " | <input> | name="isindex" | type="hidden" | <hr> #data <!doctype html><isindex name="foo"> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <form> | <hr> | <label> | "This is a searchable index. Enter search keywords: " | <input> | name="isindex" | <hr> #data <!doctype html><ruby><p><rp> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <ruby> | <p> | <rp> #data <!doctype html><ruby><div><span><rp> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <ruby> | <div> | <span> | <rp> #data <!doctype html><ruby><div><p><rp> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <ruby> | <div> | <p> | <rp> #data <!doctype html><ruby><p><rt> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <ruby> | <p> | <rt> #data <!doctype html><ruby><div><span><rt> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <ruby> | <div> | <span> | <rt> #data <!doctype html><ruby><div><p><rt> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <ruby> | <div> | <p> | <rt> #data <!doctype html><math/><foo> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> | <foo> #data <!doctype html><svg/><foo> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | <foo> #data <!doctype html><div></body><!--foo--> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <div> | <!-- foo --> #data <!doctype html><h1><div><h3><span></h1>foo #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <h1> | <div> | <h3> | <span> | "foo" #data <!doctype html><p></h3>foo #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | "foo" #data <!doctype html><h3><li>abc</h2>foo #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <h3> | <li> | "abc" | "foo" #data <!doctype html><table>abc<!--foo--> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | "abc" | <table> | <!-- foo --> #data <!doctype html><table> <!--foo--> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | " " | <!-- foo --> #data <!doctype html><table> b <!--foo--> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | " b " | <table> | <!-- foo --> #data <!doctype html><select><option><option> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | <option> | <option> #data <!doctype html><select><option></optgroup> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | <option> #data <!doctype html><select><option></optgroup> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> | <option> #data <!doctype html><p><math><mi><p><h1> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <math math> | <math mi> | <p> | <h1> #data <!doctype html><p><math><mo><p><h1> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <math math> | <math mo> | <p> | <h1> #data <!doctype html><p><math><mn><p><h1> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <math math> | <math mn> | <p> | <h1> #data <!doctype html><p><math><ms><p><h1> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <math math> | <math ms> | <p> | <h1> #data <!doctype html><p><math><mtext><p><h1> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <math math> | <math mtext> | <p> | <h1> #data <!doctype html><frameset></noframes> #errors #document | <!DOCTYPE html> | <html> | <head> | <frameset> #data <!doctype html><html c=d><body></html><html a=b> #errors #document | <!DOCTYPE html> | <html> | a="b" | c="d" | <head> | <body> #data <!doctype html><html c=d><frameset></frameset></html><html a=b> #errors #document | <!DOCTYPE html> | <html> | a="b" | c="d" | <head> | <frameset> #data <!doctype html><html><frameset></frameset></html><!--foo--> #errors #document | <!DOCTYPE html> | <html> | <head> | <frameset> | <!-- foo --> #data <!doctype html><html><frameset></frameset></html> #errors #document | <!DOCTYPE html> | <html> | <head> | <frameset> | " " #data <!doctype html><html><frameset></frameset></html>abc #errors #document | <!DOCTYPE html> | <html> | <head> | <frameset> #data <!doctype html><html><frameset></frameset></html><p> #errors #document | <!DOCTYPE html> | <html> | <head> | <frameset> #data <!doctype html><html><frameset></frameset></html></p> #errors #document | <!DOCTYPE html> | <html> | <head> | <frameset> #data <html><frameset></frameset></html><!doctype html> #errors #document | <html> | <head> | <frameset> #data <!doctype html><body><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> #data <!doctype html><p><frameset><frame> #errors #document | <!DOCTYPE html> | <html> | <head> | <frameset> | <frame> #data <!doctype html><p>a<frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | "a" #data <!doctype html><p> <frameset><frame> #errors #document | <!DOCTYPE html> | <html> | <head> | <frameset> | <frame> #data <!doctype html><pre><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <pre> #data <!doctype html><listing><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <listing> #data <!doctype html><li><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <li> #data <!doctype html><dd><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <dd> #data <!doctype html><dt><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <dt> #data <!doctype html><button><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <button> #data <!doctype html><applet><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <applet> #data <!doctype html><marquee><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <marquee> #data <!doctype html><object><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <object> #data <!doctype html><table><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> #data <!doctype html><area><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <area> #data <!doctype html><basefont><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <basefont> | <frameset> #data <!doctype html><bgsound><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <bgsound> | <frameset> #data <!doctype html><br><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <br> #data <!doctype html><embed><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <embed> #data <!doctype html><img><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <img> #data <!doctype html><input><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <input> #data <!doctype html><keygen><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <keygen> #data <!doctype html><wbr><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <wbr> #data <!doctype html><hr><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <hr> #data <!doctype html><textarea></textarea><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <textarea> #data <!doctype html><xmp></xmp><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <xmp> #data <!doctype html><iframe></iframe><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <iframe> #data <!doctype html><select></select><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <select> #data <!doctype html><svg></svg><frameset><frame> #errors #document | <!DOCTYPE html> | <html> | <head> | <frameset> | <frame> #data <!doctype html><math></math><frameset><frame> #errors #document | <!DOCTYPE html> | <html> | <head> | <frameset> | <frame> #data <!doctype html><svg><foreignObject><div> <frameset><frame> #errors #document | <!DOCTYPE html> | <html> | <head> | <frameset> | <frame> #data <!doctype html><svg>a</svg><frameset><frame> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <svg svg> | "a" #data <!doctype html><svg> </svg><frameset><frame> #errors #document | <!DOCTYPE html> | <html> | <head> | <frameset> | <frame> #data <html>aaa<frameset></frameset> #errors #document | <html> | <head> | <body> | "aaa" #data <html> a <frameset></frameset> #errors #document | <html> | <head> | <body> | "a " #data <!doctype html><div><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <frameset> #data <!doctype html><div><body><frameset> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <div> #data <!doctype html><p><math></p>a #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <math math> | "a" #data <!doctype html><p><math><mn><span></p>a #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <math math> | <math mn> | <span> | <p> | "a" #data <!doctype html><math></html> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <math math> #data <!doctype html><meta charset="ascii"> #errors #document | <!DOCTYPE html> | <html> | <head> | <meta> | charset="ascii" | <body> #data <!doctype html><meta http-equiv="content-type" content="text/html;charset=ascii"> #errors #document | <!DOCTYPE html> | <html> | <head> | <meta> | content="text/html;charset=ascii" | http-equiv="content-type" | <body> #data <!doctype html><head><!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--><meta charset="utf8"> #errors #document | <!DOCTYPE html> | <html> | <head> | <!-- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa --> | <meta> | charset="utf8" | <body> #data <!doctype html><html a=b><head></head><html c=d> #errors #document | <!DOCTYPE html> | <html> | a="b" | c="d" | <head> | <body> #data <!doctype html><image/> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <img> #data <!doctype html>a<i>b<table>c<b>d</i>e</b>f #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | "a" | <i> | "bc" | <b> | "de" | "f" | <table> #data <!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <i> | "a" | <b> | "b" | <b> | <div> | <b> | <i> | "c" | <a> | "d" | <a> | "e" | <a> | "f" | <table> #data <!doctype html><i>a<b>b<div>c<a>d</i>e</b>f #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <i> | "a" | <b> | "b" | <b> | <div> | <b> | <i> | "c" | <a> | "d" | <a> | "e" | <a> | "f" #data <!doctype html><table><i>a<b>b<div>c</i> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <i> | "a" | <b> | "b" | <b> | <div> | <i> | "c" | <table> #data <!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <i> | "a" | <b> | "b" | <b> | <div> | <b> | <i> | "c" | <a> | "d" | <a> | "e" | <a> | "f" | <table> #data <!doctype html><table><i>a<div>b<tr>c<b>d</i>e #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <i> | "a" | <div> | "b" | <i> | "c" | <b> | "d" | <b> | "e" | <table> | <tbody> | <tr> #data <!doctype html><table><td><table><i>a<div>b<b>c</i>d #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <table> | <tbody> | <tr> | <td> | <i> | "a" | <div> | <i> | "b" | <b> | "c" | <b> | "d" | <table> #data <!doctype html><body><bgsound> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <bgsound> #data <!doctype html><body><basefont> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <basefont> #data <!doctype html><a><b></a><basefont> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <a> | <b> | <basefont> #data <!doctype html><a><b></a><bgsound> #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <a> | <b> | <bgsound> #data <!doctype html><figcaption><article></figcaption>a #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <figcaption> | <article> | "a" #data <!doctype html><summary><article></summary>a #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <summary> | <article> | "a" #data <!doctype html><p><a><plaintext>b #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <p> | <a> | <plaintext> | <a> | "b" #data <!DOCTYPE html><div>a<a></div>b<p>c</p>d #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | <div> | "a" | <a> | <a> | "b" | <p> | "c" | "d" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests22.dat�������������������������������������������������������������0000644�0001751�0001751�00000006341�12235217213�017370� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <a><b><big><em><strong><div>X</a> #errors #document | <html> | <head> | <body> | <a> | <b> | <big> | <em> | <strong> | <big> | <em> | <strong> | <div> | <a> | "X" #data <a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8>A</a> #errors #document | <html> | <head> | <body> | <a> | <b> | <b> | <div> | id="1" | <a> | <div> | id="2" | <a> | <div> | id="3" | <a> | <div> | id="4" | <a> | <div> | id="5" | <a> | <div> | id="6" | <a> | <div> | id="7" | <a> | <div> | id="8" | <a> | "A" #data <a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8><div id=9>A</a> #errors #document | <html> | <head> | <body> | <a> | <b> | <b> | <div> | id="1" | <a> | <div> | id="2" | <a> | <div> | id="3" | <a> | <div> | id="4" | <a> | <div> | id="5" | <a> | <div> | id="6" | <a> | <div> | id="7" | <a> | <div> | id="8" | <a> | <div> | id="9" | "A" #data <a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8><div id=9><div id=10>A</a> #errors #document | <html> | <head> | <body> | <a> | <b> | <b> | <div> | id="1" | <a> | <div> | id="2" | <a> | <div> | id="3" | <a> | <div> | id="4" | <a> | <div> | id="5" | <a> | <div> | id="6" | <a> | <div> | id="7" | <a> | <div> | id="8" | <a> | <div> | id="9" | <div> | id="10" | "A" #data <cite><b><cite><i><cite><i><cite><i><div>X</b>TEST #errors Line: 1 Col: 6 Unexpected start tag (cite). Expected DOCTYPE. Line: 1 Col: 46 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. Line: 1 Col: 50 Expected closing tag. Unexpected end of file. #document | <html> | <head> | <body> | <cite> | <b> | <cite> | <i> | <cite> | <i> | <cite> | <i> | <i> | <i> | <div> | <b> | "X" | "TEST" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/testdata/webkit/tests24.dat�������������������������������������������������������������0000644�0001751�0001751�00000001641�12235217213�017370� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#data <!DOCTYPE html>&NotEqualTilde; #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | "≂̸" #data <!DOCTYPE html>&NotEqualTilde;A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | "≂̸A" #data <!DOCTYPE html>&ThickSpace; #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | "  " #data <!DOCTYPE html>&ThickSpace;A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | "  A" #data <!DOCTYPE html>&NotSubset; #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | "⊂⃒" #data <!DOCTYPE html>&NotSubset;A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | "⊂⃒A" #data <!DOCTYPE html>&Gopf; #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | "𝔾" #data <!DOCTYPE html>&Gopf;A #errors #document | <!DOCTYPE html> | <html> | <head> | <body> | "𝔾A" �����������������������������������������������������������������������������������������������go.net/html/testdata/webkit/README������������������������������������������������������������������0000644�0001751�0001751�00000002746�12235217213�016255� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������The *.dat files in this directory are copied from The WebKit Open Source Project, specifically $WEBKITROOT/LayoutTests/html5lib/resources. WebKit is licensed under a BSD style license. http://webkit.org/coding/bsd-license.html says: Copyright (C) 2009 Apple Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ��������������������������go.net/html/testdata/go1.html�����������������������������������������������������������������������0000644�0001751�0001751�00000230523�12235217213�015460� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Go 1 Release Notes - The Go Programming Language</title> <link type="text/css" rel="stylesheet" href="/doc/style.css"> <script type="text/javascript" src="/doc/godocs.js"></script> <link rel="search" type="application/opensearchdescription+xml" title="godoc" href="/opensearch.xml" /> <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(["_setAccount", "UA-11222381-2"]); _gaq.push(["_trackPageview"]); </script> </head> <body> <div id="topbar"><div class="container wide"> <form method="GET" action="/search"> <div id="menu"> <a href="/doc/">Documents</a> <a href="/ref/">References</a> <a href="/pkg/">Packages</a> <a href="/project/">The Project</a> <a href="/help/">Help</a> <input type="text" id="search" name="q" class="inactive" value="Search"> </div> <div id="heading"><a href="/">The Go Programming Language</a></div> </form> </div></div> <div id="page" class="wide"> <div id="plusone"><g:plusone size="small" annotation="none"></g:plusone></div> <h1>Go 1 Release Notes</h1> <div id="nav"></div> <h2 id="introduction">Introduction to Go 1</h2> <p> Go version 1, Go 1 for short, defines a language and a set of core libraries that provide a stable foundation for creating reliable products, projects, and publications. </p> <p> The driving motivation for Go 1 is stability for its users. People should be able to write Go programs and expect that they will continue to compile and run without change, on a time scale of years, including in production environments such as Google App Engine. Similarly, people should be able to write books about Go, be able to say which version of Go the book is describing, and have that version number still be meaningful much later. </p> <p> Code that compiles in Go 1 should, with few exceptions, continue to compile and run throughout the lifetime of that version, even as we issue updates and bug fixes such as Go version 1.1, 1.2, and so on. Other than critical fixes, changes made to the language and library for subsequent releases of Go 1 may add functionality but will not break existing Go 1 programs. <a href="go1compat.html">The Go 1 compatibility document</a> explains the compatibility guidelines in more detail. </p> <p> Go 1 is a representation of Go as it used today, not a wholesale rethinking of the language. We avoided designing new features and instead focused on cleaning up problems and inconsistencies and improving portability. There are a number changes to the Go language and packages that we had considered for some time and prototyped but not released primarily because they are significant and backwards-incompatible. Go 1 was an opportunity to get them out, which is helpful for the long term, but also means that Go 1 introduces incompatibilities for old programs. Fortunately, the <code>go</code> <code>fix</code> tool can automate much of the work needed to bring programs up to the Go 1 standard. </p> <p> This document outlines the major changes in Go 1 that will affect programmers updating existing code; its reference point is the prior release, r60 (tagged as r60.3). It also explains how to update code from r60 to run under Go 1. </p> <h2 id="language">Changes to the language</h2> <h3 id="append">Append</h3> <p> The <code>append</code> predeclared variadic function makes it easy to grow a slice by adding elements to the end. A common use is to add bytes to the end of a byte slice when generating output. However, <code>append</code> did not provide a way to append a string to a <code>[]byte</code>, which is another common case. </p> <pre><!--{{code "/doc/progs/go1.go" `/greeting := ..byte/` `/append.*hello/`}} --> greeting := []byte{} greeting = append(greeting, []byte(&#34;hello &#34;)...)</pre> <p> By analogy with the similar property of <code>copy</code>, Go 1 permits a string to be appended (byte-wise) directly to a byte slice, reducing the friction between strings and byte slices. The conversion is no longer necessary: </p> <pre><!--{{code "/doc/progs/go1.go" `/append.*world/`}} --> greeting = append(greeting, &#34;world&#34;...)</pre> <p> <em>Updating</em>: This is a new feature, so existing code needs no changes. </p> <h3 id="close">Close</h3> <p> The <code>close</code> predeclared function provides a mechanism for a sender to signal that no more values will be sent. It is important to the implementation of <code>for</code> <code>range</code> loops over channels and is helpful in other situations. Partly by design and partly because of race conditions that can occur otherwise, it is intended for use only by the goroutine sending on the channel, not by the goroutine receiving data. However, before Go 1 there was no compile-time checking that <code>close</code> was being used correctly. </p> <p> To close this gap, at least in part, Go 1 disallows <code>close</code> on receive-only channels. Attempting to close such a channel is a compile-time error. </p> <pre> var c chan int var csend chan&lt;- int = c var crecv &lt;-chan int = c close(c) // legal close(csend) // legal close(crecv) // illegal </pre> <p> <em>Updating</em>: Existing code that attempts to close a receive-only channel was erroneous even before Go 1 and should be fixed. The compiler will now reject such code. </p> <h3 id="literals">Composite literals</h3> <p> In Go 1, a composite literal of array, slice, or map type can elide the type specification for the elements' initializers if they are of pointer type. All four of the initializations in this example are legal; the last one was illegal before Go 1. </p> <pre><!--{{code "/doc/progs/go1.go" `/type Date struct/` `/STOP/`}} --> type Date struct { month string day int } <span class="comment">// Struct values, fully qualified; always legal.</span> holiday1 := []Date{ Date{&#34;Feb&#34;, 14}, Date{&#34;Nov&#34;, 11}, Date{&#34;Dec&#34;, 25}, } <span class="comment">// Struct values, type name elided; always legal.</span> holiday2 := []Date{ {&#34;Feb&#34;, 14}, {&#34;Nov&#34;, 11}, {&#34;Dec&#34;, 25}, } <span class="comment">// Pointers, fully qualified, always legal.</span> holiday3 := []*Date{ &amp;Date{&#34;Feb&#34;, 14}, &amp;Date{&#34;Nov&#34;, 11}, &amp;Date{&#34;Dec&#34;, 25}, } <span class="comment">// Pointers, type name elided; legal in Go 1.</span> holiday4 := []*Date{ {&#34;Feb&#34;, 14}, {&#34;Nov&#34;, 11}, {&#34;Dec&#34;, 25}, }</pre> <p> <em>Updating</em>: This change has no effect on existing code, but the command <code>gofmt</code> <code>-s</code> applied to existing source will, among other things, elide explicit element types wherever permitted. </p> <h3 id="init">Goroutines during init</h3> <p> The old language defined that <code>go</code> statements executed during initialization created goroutines but that they did not begin to run until initialization of the entire program was complete. This introduced clumsiness in many places and, in effect, limited the utility of the <code>init</code> construct: if it was possible for another package to use the library during initialization, the library was forced to avoid goroutines. This design was done for reasons of simplicity and safety but, as our confidence in the language grew, it seemed unnecessary. Running goroutines during initialization is no more complex or unsafe than running them during normal execution. </p> <p> In Go 1, code that uses goroutines can be called from <code>init</code> routines and global initialization expressions without introducing a deadlock. </p> <pre><!--{{code "/doc/progs/go1.go" `/PackageGlobal/` `/^}/`}} -->var PackageGlobal int func init() { c := make(chan int) go initializationFunction(c) PackageGlobal = &lt;-c }</pre> <p> <em>Updating</em>: This is a new feature, so existing code needs no changes, although it's possible that code that depends on goroutines not starting before <code>main</code> will break. There was no such code in the standard repository. </p> <h3 id="rune">The rune type</h3> <p> The language spec allows the <code>int</code> type to be 32 or 64 bits wide, but current implementations set <code>int</code> to 32 bits even on 64-bit platforms. It would be preferable to have <code>int</code> be 64 bits on 64-bit platforms. (There are important consequences for indexing large slices.) However, this change would waste space when processing Unicode characters with the old language because the <code>int</code> type was also used to hold Unicode code points: each code point would waste an extra 32 bits of storage if <code>int</code> grew from 32 bits to 64. </p> <p> To make changing to 64-bit <code>int</code> feasible, Go 1 introduces a new basic type, <code>rune</code>, to represent individual Unicode code points. It is an alias for <code>int32</code>, analogous to <code>byte</code> as an alias for <code>uint8</code>. </p> <p> Character literals such as <code>'a'</code>, <code>'語'</code>, and <code>'\u0345'</code> now have default type <code>rune</code>, analogous to <code>1.0</code> having default type <code>float64</code>. A variable initialized to a character constant will therefore have type <code>rune</code> unless otherwise specified. </p> <p> Libraries have been updated to use <code>rune</code> rather than <code>int</code> when appropriate. For instance, the functions <code>unicode.ToLower</code> and relatives now take and return a <code>rune</code>. </p> <pre><!--{{code "/doc/progs/go1.go" `/STARTRUNE/` `/ENDRUNE/`}} --> delta := &#39;δ&#39; <span class="comment">// delta has type rune.</span> var DELTA rune DELTA = unicode.ToUpper(delta) epsilon := unicode.ToLower(DELTA + 1) if epsilon != &#39;δ&#39;+1 { log.Fatal(&#34;inconsistent casing for Greek&#34;) }</pre> <p> <em>Updating</em>: Most source code will be unaffected by this because the type inference from <code>:=</code> initializers introduces the new type silently, and it propagates from there. Some code may get type errors that a trivial conversion will resolve. </p> <h3 id="error">The error type</h3> <p> Go 1 introduces a new built-in type, <code>error</code>, which has the following definition: </p> <pre> type error interface { Error() string } </pre> <p> Since the consequences of this type are all in the package library, it is discussed <a href="#errors">below</a>. </p> <h3 id="delete">Deleting from maps</h3> <p> In the old language, to delete the entry with key <code>k</code> from map <code>m</code>, one wrote the statement, </p> <pre> m[k] = value, false </pre> <p> This syntax was a peculiar special case, the only two-to-one assignment. It required passing a value (usually ignored) that is evaluated but discarded, plus a boolean that was nearly always the constant <code>false</code>. It did the job but was odd and a point of contention. </p> <p> In Go 1, that syntax has gone; instead there is a new built-in function, <code>delete</code>. The call </p> <pre><!--{{code "/doc/progs/go1.go" `/delete\(m, k\)/`}} --> delete(m, k)</pre> <p> will delete the map entry retrieved by the expression <code>m[k]</code>. There is no return value. Deleting a non-existent entry is a no-op. </p> <p> <em>Updating</em>: Running <code>go</code> <code>fix</code> will convert expressions of the form <code>m[k] = value, false</code> into <code>delete(m, k)</code> when it is clear that the ignored value can be safely discarded from the program and <code>false</code> refers to the predefined boolean constant. The fix tool will flag other uses of the syntax for inspection by the programmer. </p> <h3 id="iteration">Iterating in maps</h3> <p> The old language specification did not define the order of iteration for maps, and in practice it differed across hardware platforms. This caused tests that iterated over maps to be fragile and non-portable, with the unpleasant property that a test might always pass on one machine but break on another. </p> <p> In Go 1, the order in which elements are visited when iterating over a map using a <code>for</code> <code>range</code> statement is defined to be unpredictable, even if the same loop is run multiple times with the same map. Code should not assume that the elements are visited in any particular order. </p> <p> This change means that code that depends on iteration order is very likely to break early and be fixed long before it becomes a problem. Just as important, it allows the map implementation to ensure better map balancing even when programs are using range loops to select an element from a map. </p> <pre><!--{{code "/doc/progs/go1.go" `/Sunday/` `/^ }/`}} --> m := map[string]int{&#34;Sunday&#34;: 0, &#34;Monday&#34;: 1} for name, value := range m { <span class="comment">// This loop should not assume Sunday will be visited first.</span> f(name, value) }</pre> <p> <em>Updating</em>: This is one change where tools cannot help. Most existing code will be unaffected, but some programs may break or misbehave; we recommend manual checking of all range statements over maps to verify they do not depend on iteration order. There were a few such examples in the standard repository; they have been fixed. Note that it was already incorrect to depend on the iteration order, which was unspecified. This change codifies the unpredictability. </p> <h3 id="multiple_assignment">Multiple assignment</h3> <p> The language specification has long guaranteed that in assignments the right-hand-side expressions are all evaluated before any left-hand-side expressions are assigned. To guarantee predictable behavior, Go 1 refines the specification further. </p> <p> If the left-hand side of the assignment statement contains expressions that require evaluation, such as function calls or array indexing operations, these will all be done using the usual left-to-right rule before any variables are assigned their value. Once everything is evaluated, the actual assignments proceed in left-to-right order. </p> <p> These examples illustrate the behavior. </p> <pre><!--{{code "/doc/progs/go1.go" `/sa :=/` `/then sc.0. = 2/`}} --> sa := []int{1, 2, 3} i := 0 i, sa[i] = 1, 2 <span class="comment">// sets i = 1, sa[0] = 2</span> sb := []int{1, 2, 3} j := 0 sb[j], j = 2, 1 <span class="comment">// sets sb[0] = 2, j = 1</span> sc := []int{1, 2, 3} sc[0], sc[0] = 1, 2 <span class="comment">// sets sc[0] = 1, then sc[0] = 2 (so sc[0] = 2 at end)</span></pre> <p> <em>Updating</em>: This is one change where tools cannot help, but breakage is unlikely. No code in the standard repository was broken by this change, and code that depended on the previous unspecified behavior was already incorrect. </p> <h3 id="shadowing">Returns and shadowed variables</h3> <p> A common mistake is to use <code>return</code> (without arguments) after an assignment to a variable that has the same name as a result variable but is not the same variable. This situation is called <em>shadowing</em>: the result variable has been shadowed by another variable with the same name declared in an inner scope. </p> <p> In functions with named return values, the Go 1 compilers disallow return statements without arguments if any of the named return values is shadowed at the point of the return statement. (It isn't part of the specification, because this is one area we are still exploring; the situation is analogous to the compilers rejecting functions that do not end with an explicit return statement.) </p> <p> This function implicitly returns a shadowed return value and will be rejected by the compiler: </p> <pre> func Bug() (i, j, k int) { for i = 0; i &lt; 5; i++ { for j := 0; j &lt; 5; j++ { // Redeclares j. k += i*j if k > 100 { return // Rejected: j is shadowed here. } } } return // OK: j is not shadowed here. } </pre> <p> <em>Updating</em>: Code that shadows return values in this way will be rejected by the compiler and will need to be fixed by hand. The few cases that arose in the standard repository were mostly bugs. </p> <h3 id="unexported">Copying structs with unexported fields</h3> <p> The old language did not allow a package to make a copy of a struct value containing unexported fields belonging to a different package. There was, however, a required exception for a method receiver; also, the implementations of <code>copy</code> and <code>append</code> have never honored the restriction. </p> <p> Go 1 will allow packages to copy struct values containing unexported fields from other packages. Besides resolving the inconsistency, this change admits a new kind of API: a package can return an opaque value without resorting to a pointer or interface. The new implementations of <code>time.Time</code> and <code>reflect.Value</code> are examples of types taking advantage of this new property. </p> <p> As an example, if package <code>p</code> includes the definitions, </p> <pre> type Struct struct { Public int secret int } func NewStruct(a int) Struct { // Note: not a pointer. return Struct{a, f(a)} } func (s Struct) String() string { return fmt.Sprintf("{%d (secret %d)}", s.Public, s.secret) } </pre> <p> a package that imports <code>p</code> can assign and copy values of type <code>p.Struct</code> at will. Behind the scenes the unexported fields will be assigned and copied just as if they were exported, but the client code will never be aware of them. The code </p> <pre> import "p" myStruct := p.NewStruct(23) copyOfMyStruct := myStruct fmt.Println(myStruct, copyOfMyStruct) </pre> <p> will show that the secret field of the struct has been copied to the new value. </p> <p> <em>Updating</em>: This is a new feature, so existing code needs no changes. </p> <h3 id="equality">Equality</h3> <p> Before Go 1, the language did not define equality on struct and array values. This meant, among other things, that structs and arrays could not be used as map keys. On the other hand, Go did define equality on function and map values. Function equality was problematic in the presence of closures (when are two closures equal?) while map equality compared pointers, not the maps' content, which was usually not what the user would want. </p> <p> Go 1 addressed these issues. First, structs and arrays can be compared for equality and inequality (<code>==</code> and <code>!=</code>), and therefore be used as map keys, provided they are composed from elements for which equality is also defined, using element-wise comparison. </p> <pre><!--{{code "/doc/progs/go1.go" `/type Day struct/` `/Printf/`}} --> type Day struct { long string short string } Christmas := Day{&#34;Christmas&#34;, &#34;XMas&#34;} Thanksgiving := Day{&#34;Thanksgiving&#34;, &#34;Turkey&#34;} holiday := map[Day]bool{ Christmas: true, Thanksgiving: true, } fmt.Printf(&#34;Christmas is a holiday: %t\n&#34;, holiday[Christmas])</pre> <p> Second, Go 1 removes the definition of equality for function values, except for comparison with <code>nil</code>. Finally, map equality is gone too, also except for comparison with <code>nil</code>. </p> <p> Note that equality is still undefined for slices, for which the calculation is in general infeasible. Also note that the ordered comparison operators (<code>&lt;</code> <code>&lt;=</code> <code>&gt;</code> <code>&gt;=</code>) are still undefined for structs and arrays. <p> <em>Updating</em>: Struct and array equality is a new feature, so existing code needs no changes. Existing code that depends on function or map equality will be rejected by the compiler and will need to be fixed by hand. Few programs will be affected, but the fix may require some redesign. </p> <h2 id="packages">The package hierarchy</h2> <p> Go 1 addresses many deficiencies in the old standard library and cleans up a number of packages, making them more internally consistent and portable. </p> <p> This section describes how the packages have been rearranged in Go 1. Some have moved, some have been renamed, some have been deleted. New packages are described in later sections. </p> <h3 id="hierarchy">The package hierarchy</h3> <p> Go 1 has a rearranged package hierarchy that groups related items into subdirectories. For instance, <code>utf8</code> and <code>utf16</code> now occupy subdirectories of <code>unicode</code>. Also, <a href="#subrepo">some packages</a> have moved into subrepositories of <a href="http://code.google.com/p/go"><code>code.google.com/p/go</code></a> while <a href="#deleted">others</a> have been deleted outright. </p> <table class="codetable" frame="border" summary="Moved packages"> <colgroup align="left" width="60%"></colgroup> <colgroup align="left" width="40%"></colgroup> <tr> <th align="left">Old path</th> <th align="left">New path</th> </tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>asn1</td> <td>encoding/asn1</td></tr> <tr><td>csv</td> <td>encoding/csv</td></tr> <tr><td>gob</td> <td>encoding/gob</td></tr> <tr><td>json</td> <td>encoding/json</td></tr> <tr><td>xml</td> <td>encoding/xml</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>exp/template/html</td> <td>html/template</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>big</td> <td>math/big</td></tr> <tr><td>cmath</td> <td>math/cmplx</td></tr> <tr><td>rand</td> <td>math/rand</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>http</td> <td>net/http</td></tr> <tr><td>http/cgi</td> <td>net/http/cgi</td></tr> <tr><td>http/fcgi</td> <td>net/http/fcgi</td></tr> <tr><td>http/httptest</td> <td>net/http/httptest</td></tr> <tr><td>http/pprof</td> <td>net/http/pprof</td></tr> <tr><td>mail</td> <td>net/mail</td></tr> <tr><td>rpc</td> <td>net/rpc</td></tr> <tr><td>rpc/jsonrpc</td> <td>net/rpc/jsonrpc</td></tr> <tr><td>smtp</td> <td>net/smtp</td></tr> <tr><td>url</td> <td>net/url</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>exec</td> <td>os/exec</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>scanner</td> <td>text/scanner</td></tr> <tr><td>tabwriter</td> <td>text/tabwriter</td></tr> <tr><td>template</td> <td>text/template</td></tr> <tr><td>template/parse</td> <td>text/template/parse</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>utf8</td> <td>unicode/utf8</td></tr> <tr><td>utf16</td> <td>unicode/utf16</td></tr> </table> <p> Note that the package names for the old <code>cmath</code> and <code>exp/template/html</code> packages have changed to <code>cmplx</code> and <code>template</code>. </p> <p> <em>Updating</em>: Running <code>go</code> <code>fix</code> will update all imports and package renames for packages that remain inside the standard repository. Programs that import packages that are no longer in the standard repository will need to be edited by hand. </p> <h3 id="exp">The package tree exp</h3> <p> Because they are not standardized, the packages under the <code>exp</code> directory will not be available in the standard Go 1 release distributions, although they will be available in source code form in <a href="http://code.google.com/p/go/">the repository</a> for developers who wish to use them. </p> <p> Several packages have moved under <code>exp</code> at the time of Go 1's release: </p> <ul> <li><code>ebnf</code></li> <li><code>html</code><sup>&#8224;</sup></li> <li><code>go/types</code></li> </ul> <p> (<sup>&#8224;</sup>The <code>EscapeString</code> and <code>UnescapeString</code> types remain in package <code>html</code>.) </p> <p> All these packages are available under the same names, with the prefix <code>exp/</code>: <code>exp/ebnf</code> etc. </p> <p> Also, the <code>utf8.String</code> type has been moved to its own package, <code>exp/utf8string</code>. </p> <p> Finally, the <code>gotype</code> command now resides in <code>exp/gotype</code>, while <code>ebnflint</code> is now in <code>exp/ebnflint</code>. If they are installed, they now reside in <code>$GOROOT/bin/tool</code>. </p> <p> <em>Updating</em>: Code that uses packages in <code>exp</code> will need to be updated by hand, or else compiled from an installation that has <code>exp</code> available. The <code>go</code> <code>fix</code> tool or the compiler will complain about such uses. </p> <h3 id="old">The package tree old</h3> <p> Because they are deprecated, the packages under the <code>old</code> directory will not be available in the standard Go 1 release distributions, although they will be available in source code form for developers who wish to use them. </p> <p> The packages in their new locations are: </p> <ul> <li><code>old/netchan</code></li> <li><code>old/regexp</code></li> <li><code>old/template</code></li> </ul> <p> <em>Updating</em>: Code that uses packages now in <code>old</code> will need to be updated by hand, or else compiled from an installation that has <code>old</code> available. The <code>go</code> <code>fix</code> tool will warn about such uses. </p> <h3 id="deleted">Deleted packages</h3> <p> Go 1 deletes several packages outright: </p> <ul> <li><code>container/vector</code></li> <li><code>exp/datafmt</code></li> <li><code>go/typechecker</code></li> <li><code>try</code></li> </ul> <p> and also the command <code>gotry</code>. </p> <p> <em>Updating</em>: Code that uses <code>container/vector</code> should be updated to use slices directly. See <a href="http://code.google.com/p/go-wiki/wiki/SliceTricks">the Go Language Community Wiki</a> for some suggestions. Code that uses the other packages (there should be almost zero) will need to be rethought. </p> <h3 id="subrepo">Packages moving to subrepositories</h3> <p> Go 1 has moved a number of packages into other repositories, usually sub-repositories of <a href="http://code.google.com/p/go/">the main Go repository</a>. This table lists the old and new import paths: <table class="codetable" frame="border" summary="Sub-repositories"> <colgroup align="left" width="40%"></colgroup> <colgroup align="left" width="60%"></colgroup> <tr> <th align="left">Old</th> <th align="left">New</th> </tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>crypto/bcrypt</td> <td>code.google.com/p/go.crypto/bcrypt</tr> <tr><td>crypto/blowfish</td> <td>code.google.com/p/go.crypto/blowfish</tr> <tr><td>crypto/cast5</td> <td>code.google.com/p/go.crypto/cast5</tr> <tr><td>crypto/md4</td> <td>code.google.com/p/go.crypto/md4</tr> <tr><td>crypto/ocsp</td> <td>code.google.com/p/go.crypto/ocsp</tr> <tr><td>crypto/openpgp</td> <td>code.google.com/p/go.crypto/openpgp</tr> <tr><td>crypto/openpgp/armor</td> <td>code.google.com/p/go.crypto/openpgp/armor</tr> <tr><td>crypto/openpgp/elgamal</td> <td>code.google.com/p/go.crypto/openpgp/elgamal</tr> <tr><td>crypto/openpgp/errors</td> <td>code.google.com/p/go.crypto/openpgp/errors</tr> <tr><td>crypto/openpgp/packet</td> <td>code.google.com/p/go.crypto/openpgp/packet</tr> <tr><td>crypto/openpgp/s2k</td> <td>code.google.com/p/go.crypto/openpgp/s2k</tr> <tr><td>crypto/ripemd160</td> <td>code.google.com/p/go.crypto/ripemd160</tr> <tr><td>crypto/twofish</td> <td>code.google.com/p/go.crypto/twofish</tr> <tr><td>crypto/xtea</td> <td>code.google.com/p/go.crypto/xtea</tr> <tr><td>exp/ssh</td> <td>code.google.com/p/go.crypto/ssh</tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>image/bmp</td> <td>code.google.com/p/go.image/bmp</tr> <tr><td>image/tiff</td> <td>code.google.com/p/go.image/tiff</tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>net/dict</td> <td>code.google.com/p/go.net/dict</tr> <tr><td>net/websocket</td> <td>code.google.com/p/go.net/websocket</tr> <tr><td>exp/spdy</td> <td>code.google.com/p/go.net/spdy</tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>encoding/git85</td> <td>code.google.com/p/go.codereview/git85</tr> <tr><td>patch</td> <td>code.google.com/p/go.codereview/patch</tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>exp/wingui</td> <td>code.google.com/p/gowingui</tr> </table> <p> <em>Updating</em>: Running <code>go</code> <code>fix</code> will update imports of these packages to use the new import paths. Installations that depend on these packages will need to install them using a <code>go get</code> command. </p> <h2 id="major">Major changes to the library</h2> <p> This section describes significant changes to the core libraries, the ones that affect the most programs. </p> <h3 id="errors">The error type and errors package</h3> <p> The placement of <code>os.Error</code> in package <code>os</code> is mostly historical: errors first came up when implementing package <code>os</code>, and they seemed system-related at the time. Since then it has become clear that errors are more fundamental than the operating system. For example, it would be nice to use <code>Errors</code> in packages that <code>os</code> depends on, like <code>syscall</code>. Also, having <code>Error</code> in <code>os</code> introduces many dependencies on <code>os</code> that would otherwise not exist. </p> <p> Go 1 solves these problems by introducing a built-in <code>error</code> interface type and a separate <code>errors</code> package (analogous to <code>bytes</code> and <code>strings</code>) that contains utility functions. It replaces <code>os.NewError</code> with <a href="/pkg/errors/#New"><code>errors.New</code></a>, giving errors a more central place in the environment. </p> <p> So the widely-used <code>String</code> method does not cause accidental satisfaction of the <code>error</code> interface, the <code>error</code> interface uses instead the name <code>Error</code> for that method: </p> <pre> type error interface { Error() string } </pre> <p> The <code>fmt</code> library automatically invokes <code>Error</code>, as it already does for <code>String</code>, for easy printing of error values. </p> <pre><!--{{code "/doc/progs/go1.go" `/START ERROR EXAMPLE/` `/END ERROR EXAMPLE/`}} -->type SyntaxError struct { File string Line int Message string } func (se *SyntaxError) Error() string { return fmt.Sprintf(&#34;%s:%d: %s&#34;, se.File, se.Line, se.Message) }</pre> <p> All standard packages have been updated to use the new interface; the old <code>os.Error</code> is gone. </p> <p> A new package, <a href="/pkg/errors/"><code>errors</code></a>, contains the function </p> <pre> func New(text string) error </pre> <p> to turn a string into an error. It replaces the old <code>os.NewError</code>. </p> <pre><!--{{code "/doc/progs/go1.go" `/ErrSyntax/`}} --> var ErrSyntax = errors.New(&#34;syntax error&#34;)</pre> <p> <em>Updating</em>: Running <code>go</code> <code>fix</code> will update almost all code affected by the change. Code that defines error types with a <code>String</code> method will need to be updated by hand to rename the methods to <code>Error</code>. </p> <h3 id="errno">System call errors</h3> <p> The old <code>syscall</code> package, which predated <code>os.Error</code> (and just about everything else), returned errors as <code>int</code> values. In turn, the <code>os</code> package forwarded many of these errors, such as <code>EINVAL</code>, but using a different set of errors on each platform. This behavior was unpleasant and unportable. </p> <p> In Go 1, the <a href="/pkg/syscall/"><code>syscall</code></a> package instead returns an <code>error</code> for system call errors. On Unix, the implementation is done by a <a href="/pkg/syscall/#Errno"><code>syscall.Errno</code></a> type that satisfies <code>error</code> and replaces the old <code>os.Errno</code>. </p> <p> The changes affecting <code>os.EINVAL</code> and relatives are described <a href="#os">elsewhere</a>. <p> <em>Updating</em>: Running <code>go</code> <code>fix</code> will update almost all code affected by the change. Regardless, most code should use the <code>os</code> package rather than <code>syscall</code> and so will be unaffected. </p> <h3 id="time">Time</h3> <p> Time is always a challenge to support well in a programming language. The old Go <code>time</code> package had <code>int64</code> units, no real type safety, and no distinction between absolute times and durations. </p> <p> One of the most sweeping changes in the Go 1 library is therefore a complete redesign of the <a href="/pkg/time/"><code>time</code></a> package. Instead of an integer number of nanoseconds as an <code>int64</code>, and a separate <code>*time.Time</code> type to deal with human units such as hours and years, there are now two fundamental types: <a href="/pkg/time/#Time"><code>time.Time</code></a> (a value, so the <code>*</code> is gone), which represents a moment in time; and <a href="/pkg/time/#Duration"><code>time.Duration</code></a>, which represents an interval. Both have nanosecond resolution. A <code>Time</code> can represent any time into the ancient past and remote future, while a <code>Duration</code> can span plus or minus only about 290 years. There are methods on these types, plus a number of helpful predefined constant durations such as <code>time.Second</code>. </p> <p> Among the new methods are things like <a href="/pkg/time/#Time.Add"><code>Time.Add</code></a>, which adds a <code>Duration</code> to a <code>Time</code>, and <a href="/pkg/time/#Time.Sub"><code>Time.Sub</code></a>, which subtracts two <code>Times</code> to yield a <code>Duration</code>. </p> <p> The most important semantic change is that the Unix epoch (Jan 1, 1970) is now relevant only for those functions and methods that mention Unix: <a href="/pkg/time/#Unix"><code>time.Unix</code></a> and the <a href="/pkg/time/#Time.Unix"><code>Unix</code></a> and <a href="/pkg/time/#Time.UnixNano"><code>UnixNano</code></a> methods of the <code>Time</code> type. In particular, <a href="/pkg/time/#Now"><code>time.Now</code></a> returns a <code>time.Time</code> value rather than, in the old API, an integer nanosecond count since the Unix epoch. </p> <pre><!--{{code "/doc/progs/go1.go" `/sleepUntil/` `/^}/`}} --><span class="comment">// sleepUntil sleeps until the specified time. It returns immediately if it&#39;s too late.</span> func sleepUntil(wakeup time.Time) { now := time.Now() <span class="comment">// A Time.</span> if !wakeup.After(now) { return } delta := wakeup.Sub(now) <span class="comment">// A Duration.</span> fmt.Printf(&#34;Sleeping for %.3fs\n&#34;, delta.Seconds()) time.Sleep(delta) }</pre> <p> The new types, methods, and constants have been propagated through all the standard packages that use time, such as <code>os</code> and its representation of file time stamps. </p> <p> <em>Updating</em>: The <code>go</code> <code>fix</code> tool will update many uses of the old <code>time</code> package to use the new types and methods, although it does not replace values such as <code>1e9</code> representing nanoseconds per second. Also, because of type changes in some of the values that arise, some of the expressions rewritten by the fix tool may require further hand editing; in such cases the rewrite will include the correct function or method for the old functionality, but may have the wrong type or require further analysis. </p> <h2 id="minor">Minor changes to the library</h2> <p> This section describes smaller changes, such as those to less commonly used packages or that affect few programs beyond the need to run <code>go</code> <code>fix</code>. This category includes packages that are new in Go 1. Collectively they improve portability, regularize behavior, and make the interfaces more modern and Go-like. </p> <h3 id="archive_zip">The archive/zip package</h3> <p> In Go 1, <a href="/pkg/archive/zip/#Writer"><code>*zip.Writer</code></a> no longer has a <code>Write</code> method. Its presence was a mistake. </p> <p> <em>Updating</em>: What little code is affected will be caught by the compiler and must be updated by hand. </p> <h3 id="bufio">The bufio package</h3> <p> In Go 1, <a href="/pkg/bufio/#NewReaderSize"><code>bufio.NewReaderSize</code></a> and <a href="/pkg/bufio/#NewWriterSize"><code>bufio.NewWriterSize</code></a> functions no longer return an error for invalid sizes. If the argument size is too small or invalid, it is adjusted. </p> <p> <em>Updating</em>: Running <code>go</code> <code>fix</code> will update calls that assign the error to _. Calls that aren't fixed will be caught by the compiler and must be updated by hand. </p> <h3 id="compress">The compress/flate, compress/gzip and compress/zlib packages</h3> <p> In Go 1, the <code>NewWriterXxx</code> functions in <a href="/pkg/compress/flate"><code>compress/flate</code></a>, <a href="/pkg/compress/gzip"><code>compress/gzip</code></a> and <a href="/pkg/compress/zlib"><code>compress/zlib</code></a> all return <code>(*Writer, error)</code> if they take a compression level, and <code>*Writer</code> otherwise. Package <code>gzip</code>'s <code>Compressor</code> and <code>Decompressor</code> types have been renamed to <code>Writer</code> and <code>Reader</code>. Package <code>flate</code>'s <code>WrongValueError</code> type has been removed. </p> <p> <em>Updating</em> Running <code>go</code> <code>fix</code> will update old names and calls that assign the error to _. Calls that aren't fixed will be caught by the compiler and must be updated by hand. </p> <h3 id="crypto_aes_des">The crypto/aes and crypto/des packages</h3> <p> In Go 1, the <code>Reset</code> method has been removed. Go does not guarantee that memory is not copied and therefore this method was misleading. </p> <p> The cipher-specific types <code>*aes.Cipher</code>, <code>*des.Cipher</code>, and <code>*des.TripleDESCipher</code> have been removed in favor of <code>cipher.Block</code>. </p> <p> <em>Updating</em>: Remove the calls to Reset. Replace uses of the specific cipher types with cipher.Block. </p> <h3 id="crypto_elliptic">The crypto/elliptic package</h3> <p> In Go 1, <a href="/pkg/crypto/elliptic/#Curve"><code>elliptic.Curve</code></a> has been made an interface to permit alternative implementations. The curve parameters have been moved to the <a href="/pkg/crypto/elliptic/#CurveParams"><code>elliptic.CurveParams</code></a> structure. </p> <p> <em>Updating</em>: Existing users of <code>*elliptic.Curve</code> will need to change to simply <code>elliptic.Curve</code>. Calls to <code>Marshal</code>, <code>Unmarshal</code> and <code>GenerateKey</code> are now functions in <code>crypto/elliptic</code> that take an <code>elliptic.Curve</code> as their first argument. </p> <h3 id="crypto_hmac">The crypto/hmac package</h3> <p> In Go 1, the hash-specific functions, such as <code>hmac.NewMD5</code>, have been removed from <code>crypto/hmac</code>. Instead, <code>hmac.New</code> takes a function that returns a <code>hash.Hash</code>, such as <code>md5.New</code>. </p> <p> <em>Updating</em>: Running <code>go</code> <code>fix</code> will perform the needed changes. </p> <h3 id="crypto_x509">The crypto/x509 package</h3> <p> In Go 1, the <a href="/pkg/crypto/x509/#CreateCertificate"><code>CreateCertificate</code></a> and <a href="/pkg/crypto/x509/#CreateCRL"><code>CreateCRL</code></a> functions in <code>crypto/x509</code> have been altered to take an <code>interface{}</code> where they previously took a <code>*rsa.PublicKey</code> or <code>*rsa.PrivateKey</code>. This will allow other public key algorithms to be implemented in the future. </p> <p> <em>Updating</em>: No changes will be needed. </p> <h3 id="encoding_binary">The encoding/binary package</h3> <p> In Go 1, the <code>binary.TotalSize</code> function has been replaced by <a href="/pkg/encoding/binary/#Size"><code>Size</code></a>, which takes an <code>interface{}</code> argument rather than a <code>reflect.Value</code>. </p> <p> <em>Updating</em>: What little code is affected will be caught by the compiler and must be updated by hand. </p> <h3 id="encoding_xml">The encoding/xml package</h3> <p> In Go 1, the <a href="/pkg/encoding/xml/"><code>xml</code></a> package has been brought closer in design to the other marshaling packages such as <a href="/pkg/encoding/gob/"><code>encoding/gob</code></a>. </p> <p> The old <code>Parser</code> type is renamed <a href="/pkg/encoding/xml/#Decoder"><code>Decoder</code></a> and has a new <a href="/pkg/encoding/xml/#Decoder.Decode"><code>Decode</code></a> method. An <a href="/pkg/encoding/xml/#Encoder"><code>Encoder</code></a> type was also introduced. </p> <p> The functions <a href="/pkg/encoding/xml/#Marshal"><code>Marshal</code></a> and <a href="/pkg/encoding/xml/#Unmarshal"><code>Unmarshal</code></a> work with <code>[]byte</code> values now. To work with streams, use the new <a href="/pkg/encoding/xml/#Encoder"><code>Encoder</code></a> and <a href="/pkg/encoding/xml/#Decoder"><code>Decoder</code></a> types. </p> <p> When marshaling or unmarshaling values, the format of supported flags in field tags has changed to be closer to the <a href="/pkg/encoding/json"><code>json</code></a> package (<code>`xml:"name,flag"`</code>). The matching done between field tags, field names, and the XML attribute and element names is now case-sensitive. The <code>XMLName</code> field tag, if present, must also match the name of the XML element being marshaled. </p> <p> <em>Updating</em>: Running <code>go</code> <code>fix</code> will update most uses of the package except for some calls to <code>Unmarshal</code>. Special care must be taken with field tags, since the fix tool will not update them and if not fixed by hand they will misbehave silently in some cases. For example, the old <code>"attr"</code> is now written <code>",attr"</code> while plain <code>"attr"</code> remains valid but with a different meaning. </p> <h3 id="expvar">The expvar package</h3> <p> In Go 1, the <code>RemoveAll</code> function has been removed. The <code>Iter</code> function and Iter method on <code>*Map</code> have been replaced by <a href="/pkg/expvar/#Do"><code>Do</code></a> and <a href="/pkg/expvar/#Map.Do"><code>(*Map).Do</code></a>. </p> <p> <em>Updating</em>: Most code using <code>expvar</code> will not need changing. The rare code that used <code>Iter</code> can be updated to pass a closure to <code>Do</code> to achieve the same effect. </p> <h3 id="flag">The flag package</h3> <p> In Go 1, the interface <a href="/pkg/flag/#Value"><code>flag.Value</code></a> has changed slightly. The <code>Set</code> method now returns an <code>error</code> instead of a <code>bool</code> to indicate success or failure. </p> <p> There is also a new kind of flag, <code>Duration</code>, to support argument values specifying time intervals. Values for such flags must be given units, just as <code>time.Duration</code> formats them: <code>10s</code>, <code>1h30m</code>, etc. </p> <pre><!--{{code "/doc/progs/go1.go" `/timeout/`}} -->var timeout = flag.Duration(&#34;timeout&#34;, 30*time.Second, &#34;how long to wait for completion&#34;)</pre> <p> <em>Updating</em>: Programs that implement their own flags will need minor manual fixes to update their <code>Set</code> methods. The <code>Duration</code> flag is new and affects no existing code. </p> <h3 id="go">The go/* packages</h3> <p> Several packages under <code>go</code> have slightly revised APIs. </p> <p> A concrete <code>Mode</code> type was introduced for configuration mode flags in the packages <a href="/pkg/go/scanner/"><code>go/scanner</code></a>, <a href="/pkg/go/parser/"><code>go/parser</code></a>, <a href="/pkg/go/printer/"><code>go/printer</code></a>, and <a href="/pkg/go/doc/"><code>go/doc</code></a>. </p> <p> The modes <code>AllowIllegalChars</code> and <code>InsertSemis</code> have been removed from the <a href="/pkg/go/scanner/"><code>go/scanner</code></a> package. They were mostly useful for scanning text other then Go source files. Instead, the <a href="/pkg/text/scanner/"><code>text/scanner</code></a> package should be used for that purpose. </p> <p> The <a href="/pkg/go/scanner/#ErrorHandler"><code>ErrorHandler</code></a> provided to the scanner's <a href="/pkg/go/scanner/#Scanner.Init"><code>Init</code></a> method is now simply a function rather than an interface. The <code>ErrorVector</code> type has been removed in favor of the (existing) <a href="/pkg/go/scanner/#ErrorList"><code>ErrorList</code></a> type, and the <code>ErrorVector</code> methods have been migrated. Instead of embedding an <code>ErrorVector</code> in a client of the scanner, now a client should maintain an <code>ErrorList</code>. </p> <p> The set of parse functions provided by the <a href="/pkg/go/parser/"><code>go/parser</code></a> package has been reduced to the primary parse function <a href="/pkg/go/parser/#ParseFile"><code>ParseFile</code></a>, and a couple of convenience functions <a href="/pkg/go/parser/#ParseDir"><code>ParseDir</code></a> and <a href="/pkg/go/parser/#ParseExpr"><code>ParseExpr</code></a>. </p> <p> The <a href="/pkg/go/printer/"><code>go/printer</code></a> package supports an additional configuration mode <a href="/pkg/go/printer/#Mode"><code>SourcePos</code></a>; if set, the printer will emit <code>//line</code> comments such that the generated output contains the original source code position information. The new type <a href="/pkg/go/printer/#CommentedNode"><code>CommentedNode</code></a> can be used to provide comments associated with an arbitrary <a href="/pkg/go/ast/#Node"><code>ast.Node</code></a> (until now only <a href="/pkg/go/ast/#File"><code>ast.File</code></a> carried comment information). </p> <p> The type names of the <a href="/pkg/go/doc/"><code>go/doc</code></a> package have been streamlined by removing the <code>Doc</code> suffix: <code>PackageDoc</code> is now <code>Package</code>, <code>ValueDoc</code> is <code>Value</code>, etc. Also, all types now consistently have a <code>Name</code> field (or <code>Names</code>, in the case of type <code>Value</code>) and <code>Type.Factories</code> has become <code>Type.Funcs</code>. Instead of calling <code>doc.NewPackageDoc(pkg, importpath)</code>, documentation for a package is created with: </p> <pre> doc.New(pkg, importpath, mode) </pre> <p> where the new <code>mode</code> parameter specifies the operation mode: if set to <a href="/pkg/go/doc/#AllDecls"><code>AllDecls</code></a>, all declarations (not just exported ones) are considered. The function <code>NewFileDoc</code> was removed, and the function <code>CommentText</code> has become the method <a href="/pkg/go/ast/#Text"><code>Text</code></a> of <a href="/pkg/go/ast/#CommentGroup"><code>ast.CommentGroup</code></a>. </p> <p> In package <a href="/pkg/go/token/"><code>go/token</code></a>, the <a href="/pkg/go/token/#FileSet"><code>token.FileSet</code></a> method <code>Files</code> (which originally returned a channel of <code>*token.File</code>s) has been replaced with the iterator <a href="/pkg/go/token/#FileSet.Iterate"><code>Iterate</code></a> that accepts a function argument instead. </p> <p> In package <a href="/pkg/go/build/"><code>go/build</code></a>, the API has been nearly completely replaced. The package still computes Go package information but it does not run the build: the <code>Cmd</code> and <code>Script</code> types are gone. (To build code, use the new <a href="/cmd/go/"><code>go</code></a> command instead.) The <code>DirInfo</code> type is now named <a href="/pkg/go/build/#Package"><code>Package</code></a>. <code>FindTree</code> and <code>ScanDir</code> are replaced by <a href="/pkg/go/build/#Import"><code>Import</code></a> and <a href="/pkg/go/build/#ImportDir"><code>ImportDir</code></a>. </p> <p> <em>Updating</em>: Code that uses packages in <code>go</code> will have to be updated by hand; the compiler will reject incorrect uses. Templates used in conjunction with any of the <code>go/doc</code> types may need manual fixes; the renamed fields will lead to run-time errors. </p> <h3 id="hash">The hash package</h3> <p> In Go 1, the definition of <a href="/pkg/hash/#Hash"><code>hash.Hash</code></a> includes a new method, <code>BlockSize</code>. This new method is used primarily in the cryptographic libraries. </p> <p> The <code>Sum</code> method of the <a href="/pkg/hash/#Hash"><code>hash.Hash</code></a> interface now takes a <code>[]byte</code> argument, to which the hash value will be appended. The previous behavior can be recreated by adding a <code>nil</code> argument to the call. </p> <p> <em>Updating</em>: Existing implementations of <code>hash.Hash</code> will need to add a <code>BlockSize</code> method. Hashes that process the input one byte at a time can implement <code>BlockSize</code> to return 1. Running <code>go</code> <code>fix</code> will update calls to the <code>Sum</code> methods of the various implementations of <code>hash.Hash</code>. </p> <p> <em>Updating</em>: Since the package's functionality is new, no updating is necessary. </p> <h3 id="http">The http package</h3> <p> In Go 1 the <a href="/pkg/net/http/"><code>http</code></a> package is refactored, putting some of the utilities into a <a href="/pkg/net/http/httputil/"><code>httputil</code></a> subdirectory. These pieces are only rarely needed by HTTP clients. The affected items are: </p> <ul> <li>ClientConn</li> <li>DumpRequest</li> <li>DumpRequestOut</li> <li>DumpResponse</li> <li>NewChunkedReader</li> <li>NewChunkedWriter</li> <li>NewClientConn</li> <li>NewProxyClientConn</li> <li>NewServerConn</li> <li>NewSingleHostReverseProxy</li> <li>ReverseProxy</li> <li>ServerConn</li> </ul> <p> The <code>Request.RawURL</code> field has been removed; it was a historical artifact. </p> <p> The <code>Handle</code> and <code>HandleFunc</code> functions, and the similarly-named methods of <code>ServeMux</code>, now panic if an attempt is made to register the same pattern twice. </p> <p> <em>Updating</em>: Running <code>go</code> <code>fix</code> will update the few programs that are affected except for uses of <code>RawURL</code>, which must be fixed by hand. </p> <h3 id="image">The image package</h3> <p> The <a href="/pkg/image/"><code>image</code></a> package has had a number of minor changes, rearrangements and renamings. </p> <p> Most of the color handling code has been moved into its own package, <a href="/pkg/image/color/"><code>image/color</code></a>. For the elements that moved, a symmetry arises; for instance, each pixel of an <a href="/pkg/image/#RGBA"><code>image.RGBA</code></a> is a <a href="/pkg/image/color/#RGBA"><code>color.RGBA</code></a>. </p> <p> The old <code>image/ycbcr</code> package has been folded, with some renamings, into the <a href="/pkg/image/"><code>image</code></a> and <a href="/pkg/image/color/"><code>image/color</code></a> packages. </p> <p> The old <code>image.ColorImage</code> type is still in the <code>image</code> package but has been renamed <a href="/pkg/image/#Uniform"><code>image.Uniform</code></a>, while <code>image.Tiled</code> has been removed. </p> <p> This table lists the renamings. </p> <table class="codetable" frame="border" summary="image renames"> <colgroup align="left" width="50%"></colgroup> <colgroup align="left" width="50%"></colgroup> <tr> <th align="left">Old</th> <th align="left">New</th> </tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>image.Color</td> <td>color.Color</td></tr> <tr><td>image.ColorModel</td> <td>color.Model</td></tr> <tr><td>image.ColorModelFunc</td> <td>color.ModelFunc</td></tr> <tr><td>image.PalettedColorModel</td> <td>color.Palette</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>image.RGBAColor</td> <td>color.RGBA</td></tr> <tr><td>image.RGBA64Color</td> <td>color.RGBA64</td></tr> <tr><td>image.NRGBAColor</td> <td>color.NRGBA</td></tr> <tr><td>image.NRGBA64Color</td> <td>color.NRGBA64</td></tr> <tr><td>image.AlphaColor</td> <td>color.Alpha</td></tr> <tr><td>image.Alpha16Color</td> <td>color.Alpha16</td></tr> <tr><td>image.GrayColor</td> <td>color.Gray</td></tr> <tr><td>image.Gray16Color</td> <td>color.Gray16</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>image.RGBAColorModel</td> <td>color.RGBAModel</td></tr> <tr><td>image.RGBA64ColorModel</td> <td>color.RGBA64Model</td></tr> <tr><td>image.NRGBAColorModel</td> <td>color.NRGBAModel</td></tr> <tr><td>image.NRGBA64ColorModel</td> <td>color.NRGBA64Model</td></tr> <tr><td>image.AlphaColorModel</td> <td>color.AlphaModel</td></tr> <tr><td>image.Alpha16ColorModel</td> <td>color.Alpha16Model</td></tr> <tr><td>image.GrayColorModel</td> <td>color.GrayModel</td></tr> <tr><td>image.Gray16ColorModel</td> <td>color.Gray16Model</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>ycbcr.RGBToYCbCr</td> <td>color.RGBToYCbCr</td></tr> <tr><td>ycbcr.YCbCrToRGB</td> <td>color.YCbCrToRGB</td></tr> <tr><td>ycbcr.YCbCrColorModel</td> <td>color.YCbCrModel</td></tr> <tr><td>ycbcr.YCbCrColor</td> <td>color.YCbCr</td></tr> <tr><td>ycbcr.YCbCr</td> <td>image.YCbCr</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>ycbcr.SubsampleRatio444</td> <td>image.YCbCrSubsampleRatio444</td></tr> <tr><td>ycbcr.SubsampleRatio422</td> <td>image.YCbCrSubsampleRatio422</td></tr> <tr><td>ycbcr.SubsampleRatio420</td> <td>image.YCbCrSubsampleRatio420</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>image.ColorImage</td> <td>image.Uniform</td></tr> </table> <p> The image package's <code>New</code> functions (<a href="/pkg/image/#NewRGBA"><code>NewRGBA</code></a>, <a href="/pkg/image/#NewRGBA64"><code>NewRGBA64</code></a>, etc.) take an <a href="/pkg/image/#Rectangle"><code>image.Rectangle</code></a> as an argument instead of four integers. </p> <p> Finally, there are new predefined <code>color.Color</code> variables <a href="/pkg/image/color/#Black"><code>color.Black</code></a>, <a href="/pkg/image/color/#White"><code>color.White</code></a>, <a href="/pkg/image/color/#Opaque"><code>color.Opaque</code></a> and <a href="/pkg/image/color/#Transparent"><code>color.Transparent</code></a>. </p> <p> <em>Updating</em>: Running <code>go</code> <code>fix</code> will update almost all code affected by the change. </p> <h3 id="log_syslog">The log/syslog package</h3> <p> In Go 1, the <a href="/pkg/log/syslog/#NewLogger"><code>syslog.NewLogger</code></a> function returns an error as well as a <code>log.Logger</code>. </p> <p> <em>Updating</em>: What little code is affected will be caught by the compiler and must be updated by hand. </p> <h3 id="mime">The mime package</h3> <p> In Go 1, the <a href="/pkg/mime/#FormatMediaType"><code>FormatMediaType</code></a> function of the <code>mime</code> package has been simplified to make it consistent with <a href="/pkg/mime/#ParseMediaType"><code>ParseMediaType</code></a>. It now takes <code>"text/html"</code> rather than <code>"text"</code> and <code>"html"</code>. </p> <p> <em>Updating</em>: What little code is affected will be caught by the compiler and must be updated by hand. </p> <h3 id="net">The net package</h3> <p> In Go 1, the various <code>SetTimeout</code>, <code>SetReadTimeout</code>, and <code>SetWriteTimeout</code> methods have been replaced with <a href="/pkg/net/#IPConn.SetDeadline"><code>SetDeadline</code></a>, <a href="/pkg/net/#IPConn.SetReadDeadline"><code>SetReadDeadline</code></a>, and <a href="/pkg/net/#IPConn.SetWriteDeadline"><code>SetWriteDeadline</code></a>, respectively. Rather than taking a timeout value in nanoseconds that apply to any activity on the connection, the new methods set an absolute deadline (as a <code>time.Time</code> value) after which reads and writes will time out and no longer block. </p> <p> There are also new functions <a href="/pkg/net/#DialTimeout"><code>net.DialTimeout</code></a> to simplify timing out dialing a network address and <a href="/pkg/net/#ListenMulticastUDP"><code>net.ListenMulticastUDP</code></a> to allow multicast UDP to listen concurrently across multiple listeners. The <code>net.ListenMulticastUDP</code> function replaces the old <code>JoinGroup</code> and <code>LeaveGroup</code> methods. </p> <p> <em>Updating</em>: Code that uses the old methods will fail to compile and must be updated by hand. The semantic change makes it difficult for the fix tool to update automatically. </p> <h3 id="os">The os package</h3> <p> The <code>Time</code> function has been removed; callers should use the <a href="/pkg/time/#Time"><code>Time</code></a> type from the <code>time</code> package. </p> <p> The <code>Exec</code> function has been removed; callers should use <code>Exec</code> from the <code>syscall</code> package, where available. </p> <p> The <code>ShellExpand</code> function has been renamed to <a href="/pkg/os/#ExpandEnv"><code>ExpandEnv</code></a>. </p> <p> The <a href="/pkg/os/#NewFile"><code>NewFile</code></a> function now takes a <code>uintptr</code> fd, instead of an <code>int</code>. The <a href="/pkg/os/#File.Fd"><code>Fd</code></a> method on files now also returns a <code>uintptr</code>. </p> <p> There are no longer error constants such as <code>EINVAL</code> in the <code>os</code> package, since the set of values varied with the underlying operating system. There are new portable functions like <a href="/pkg/os/#IsPermission"><code>IsPermission</code></a> to test common error properties, plus a few new error values with more Go-like names, such as <a href="/pkg/os/#ErrPermission"><code>ErrPermission</code></a> and <a href="/pkg/os/#ErrNoEnv"><code>ErrNoEnv</code></a>. </p> <p> The <code>Getenverror</code> function has been removed. To distinguish between a non-existent environment variable and an empty string, use <a href="/pkg/os/#Environ"><code>os.Environ</code></a> or <a href="/pkg/syscall/#Getenv"><code>syscall.Getenv</code></a>. </p> <p> The <a href="/pkg/os/#Process.Wait"><code>Process.Wait</code></a> method has dropped its option argument and the associated constants are gone from the package. Also, the function <code>Wait</code> is gone; only the method of the <code>Process</code> type persists. </p> <p> The <code>Waitmsg</code> type returned by <a href="/pkg/os/#Process.Wait"><code>Process.Wait</code></a> has been replaced with a more portable <a href="/pkg/os/#ProcessState"><code>ProcessState</code></a> type with accessor methods to recover information about the process. Because of changes to <code>Wait</code>, the <code>ProcessState</code> value always describes an exited process. Portability concerns simplified the interface in other ways, but the values returned by the <a href="/pkg/os/#ProcessState.Sys"><code>ProcessState.Sys</code></a> and <a href="/pkg/os/#ProcessState.SysUsage"><code>ProcessState.SysUsage</code></a> methods can be type-asserted to underlying system-specific data structures such as <a href="/pkg/syscall/#WaitStatus"><code>syscall.WaitStatus</code></a> and <a href="/pkg/syscall/#Rusage"><code>syscall.Rusage</code></a> on Unix. </p> <p> <em>Updating</em>: Running <code>go</code> <code>fix</code> will drop a zero argument to <code>Process.Wait</code>. All other changes will be caught by the compiler and must be updated by hand. </p> <h4 id="os_fileinfo">The os.FileInfo type</h4> <p> Go 1 redefines the <a href="/pkg/os/#FileInfo"><code>os.FileInfo</code></a> type, changing it from a struct to an interface: </p> <pre> type FileInfo interface { Name() string // base name of the file Size() int64 // length in bytes Mode() FileMode // file mode bits ModTime() time.Time // modification time IsDir() bool // abbreviation for Mode().IsDir() Sys() interface{} // underlying data source (can return nil) } </pre> <p> The file mode information has been moved into a subtype called <a href="/pkg/os/#FileMode"><code>os.FileMode</code></a>, a simple integer type with <code>IsDir</code>, <code>Perm</code>, and <code>String</code> methods. </p> <p> The system-specific details of file modes and properties such as (on Unix) i-number have been removed from <code>FileInfo</code> altogether. Instead, each operating system's <code>os</code> package provides an implementation of the <code>FileInfo</code> interface, which has a <code>Sys</code> method that returns the system-specific representation of file metadata. For instance, to discover the i-number of a file on a Unix system, unpack the <code>FileInfo</code> like this: </p> <pre> fi, err := os.Stat("hello.go") if err != nil { log.Fatal(err) } // Check that it's a Unix file. unixStat, ok := fi.Sys().(*syscall.Stat_t) if !ok { log.Fatal("hello.go: not a Unix file") } fmt.Printf("file i-number: %d\n", unixStat.Ino) </pre> <p> Assuming (which is unwise) that <code>"hello.go"</code> is a Unix file, the i-number expression could be contracted to </p> <pre> fi.Sys().(*syscall.Stat_t).Ino </pre> <p> The vast majority of uses of <code>FileInfo</code> need only the methods of the standard interface. </p> <p> The <code>os</code> package no longer contains wrappers for the POSIX errors such as <code>ENOENT</code>. For the few programs that need to verify particular error conditions, there are now the boolean functions <a href="/pkg/os/#IsExist"><code>IsExist</code></a>, <a href="/pkg/os/#IsNotExist"><code>IsNotExist</code></a> and <a href="/pkg/os/#IsPermission"><code>IsPermission</code></a>. </p> <pre><!--{{code "/doc/progs/go1.go" `/os\.Open/` `/}/`}} --> f, err := os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) if os.IsExist(err) { log.Printf(&#34;%s already exists&#34;, name) }</pre> <p> <em>Updating</em>: Running <code>go</code> <code>fix</code> will update code that uses the old equivalent of the current <code>os.FileInfo</code> and <code>os.FileMode</code> API. Code that needs system-specific file details will need to be updated by hand. Code that uses the old POSIX error values from the <code>os</code> package will fail to compile and will also need to be updated by hand. </p> <h3 id="os_signal">The os/signal package</h3> <p> The <code>os/signal</code> package in Go 1 replaces the <code>Incoming</code> function, which returned a channel that received all incoming signals, with the selective <code>Notify</code> function, which asks for delivery of specific signals on an existing channel. </p> <p> <em>Updating</em>: Code must be updated by hand. A literal translation of </p> <pre> c := signal.Incoming() </pre> <p> is </p> <pre> c := make(chan os.Signal) signal.Notify(c) // ask for all signals </pre> <p> but most code should list the specific signals it wants to handle instead: </p> <pre> c := make(chan os.Signal) signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT) </pre> <h3 id="path_filepath">The path/filepath package</h3> <p> In Go 1, the <a href="/pkg/path/filepath/#Walk"><code>Walk</code></a> function of the <code>path/filepath</code> package has been changed to take a function value of type <a href="/pkg/path/filepath/#WalkFunc"><code>WalkFunc</code></a> instead of a <code>Visitor</code> interface value. <code>WalkFunc</code> unifies the handling of both files and directories. </p> <pre> type WalkFunc func(path string, info os.FileInfo, err error) error </pre> <p> The <code>WalkFunc</code> function will be called even for files or directories that could not be opened; in such cases the error argument will describe the failure. If a directory's contents are to be skipped, the function should return the value <a href="/pkg/path/filepath/#variables"><code>filepath.SkipDir</code></a> </p> <pre><!--{{code "/doc/progs/go1.go" `/STARTWALK/` `/ENDWALK/`}} --> markFn := func(path string, info os.FileInfo, err error) error { if path == &#34;pictures&#34; { <span class="comment">// Will skip walking of directory pictures and its contents.</span> return filepath.SkipDir } if err != nil { return err } log.Println(path) return nil } err := filepath.Walk(&#34;.&#34;, markFn) if err != nil { log.Fatal(err) }</pre> <p> <em>Updating</em>: The change simplifies most code but has subtle consequences, so affected programs will need to be updated by hand. The compiler will catch code using the old interface. </p> <h3 id="regexp">The regexp package</h3> <p> The <a href="/pkg/regexp/"><code>regexp</code></a> package has been rewritten. It has the same interface but the specification of the regular expressions it supports has changed from the old "egrep" form to that of <a href="http://code.google.com/p/re2/">RE2</a>. </p> <p> <em>Updating</em>: Code that uses the package should have its regular expressions checked by hand. </p> <h3 id="runtime">The runtime package</h3> <p> In Go 1, much of the API exported by package <code>runtime</code> has been removed in favor of functionality provided by other packages. Code using the <code>runtime.Type</code> interface or its specific concrete type implementations should now use package <a href="/pkg/reflect/"><code>reflect</code></a>. Code using <code>runtime.Semacquire</code> or <code>runtime.Semrelease</code> should use channels or the abstractions in package <a href="/pkg/sync/"><code>sync</code></a>. The <code>runtime.Alloc</code>, <code>runtime.Free</code>, and <code>runtime.Lookup</code> functions, an unsafe API created for debugging the memory allocator, have no replacement. </p> <p> Before, <code>runtime.MemStats</code> was a global variable holding statistics about memory allocation, and calls to <code>runtime.UpdateMemStats</code> ensured that it was up to date. In Go 1, <code>runtime.MemStats</code> is a struct type, and code should use <a href="/pkg/runtime/#ReadMemStats"><code>runtime.ReadMemStats</code></a> to obtain the current statistics. </p> <p> The package adds a new function, <a href="/pkg/runtime/#NumCPU"><code>runtime.NumCPU</code></a>, that returns the number of CPUs available for parallel execution, as reported by the operating system kernel. Its value can inform the setting of <code>GOMAXPROCS</code>. The <code>runtime.Cgocalls</code> and <code>runtime.Goroutines</code> functions have been renamed to <code>runtime.NumCgoCall</code> and <code>runtime.NumGoroutine</code>. </p> <p> <em>Updating</em>: Running <code>go</code> <code>fix</code> will update code for the function renamings. Other code will need to be updated by hand. </p> <h3 id="strconv">The strconv package</h3> <p> In Go 1, the <a href="/pkg/strconv/"><code>strconv</code></a> package has been significantly reworked to make it more Go-like and less C-like, although <code>Atoi</code> lives on (it's similar to <code>int(ParseInt(x, 10, 0))</code>, as does <code>Itoa(x)</code> (<code>FormatInt(int64(x), 10)</code>). There are also new variants of some of the functions that append to byte slices rather than return strings, to allow control over allocation. </p> <p> This table summarizes the renamings; see the <a href="/pkg/strconv/">package documentation</a> for full details. </p> <table class="codetable" frame="border" summary="strconv renames"> <colgroup align="left" width="50%"></colgroup> <colgroup align="left" width="50%"></colgroup> <tr> <th align="left">Old call</th> <th align="left">New call</th> </tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>Atob(x)</td> <td>ParseBool(x)</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>Atof32(x)</td> <td>ParseFloat(x, 32)§</td></tr> <tr><td>Atof64(x)</td> <td>ParseFloat(x, 64)</td></tr> <tr><td>AtofN(x, n)</td> <td>ParseFloat(x, n)</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>Atoi(x)</td> <td>Atoi(x)</td></tr> <tr><td>Atoi(x)</td> <td>ParseInt(x, 10, 0)§</td></tr> <tr><td>Atoi64(x)</td> <td>ParseInt(x, 10, 64)</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>Atoui(x)</td> <td>ParseUint(x, 10, 0)§</td></tr> <tr><td>Atoui64(x)</td> <td>ParseUint(x, 10, 64)</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>Btoi64(x, b)</td> <td>ParseInt(x, b, 64)</td></tr> <tr><td>Btoui64(x, b)</td> <td>ParseUint(x, b, 64)</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>Btoa(x)</td> <td>FormatBool(x)</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>Ftoa32(x, f, p)</td> <td>FormatFloat(float64(x), f, p, 32)</td></tr> <tr><td>Ftoa64(x, f, p)</td> <td>FormatFloat(x, f, p, 64)</td></tr> <tr><td>FtoaN(x, f, p, n)</td> <td>FormatFloat(x, f, p, n)</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>Itoa(x)</td> <td>Itoa(x)</td></tr> <tr><td>Itoa(x)</td> <td>FormatInt(int64(x), 10)</td></tr> <tr><td>Itoa64(x)</td> <td>FormatInt(x, 10)</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>Itob(x, b)</td> <td>FormatInt(int64(x), b)</td></tr> <tr><td>Itob64(x, b)</td> <td>FormatInt(x, b)</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>Uitoa(x)</td> <td>FormatUint(uint64(x), 10)</td></tr> <tr><td>Uitoa64(x)</td> <td>FormatUint(x, 10)</td></tr> <tr> <td colspan="2"><hr></td> </tr> <tr><td>Uitob(x, b)</td> <td>FormatUint(uint64(x), b)</td></tr> <tr><td>Uitob64(x, b)</td> <td>FormatUint(x, b)</td></tr> </table> <p> <em>Updating</em>: Running <code>go</code> <code>fix</code> will update almost all code affected by the change. <br> § <code>Atoi</code> persists but <code>Atoui</code> and <code>Atof32</code> do not, so they may require a cast that must be added by hand; the <code>go</code> <code>fix</code> tool will warn about it. </p> <h3 id="templates">The template packages</h3> <p> The <code>template</code> and <code>exp/template/html</code> packages have moved to <a href="/pkg/text/template/"><code>text/template</code></a> and <a href="/pkg/html/template/"><code>html/template</code></a>. More significant, the interface to these packages has been simplified. The template language is the same, but the concept of "template set" is gone and the functions and methods of the packages have changed accordingly, often by elimination. </p> <p> Instead of sets, a <code>Template</code> object may contain multiple named template definitions, in effect constructing name spaces for template invocation. A template can invoke any other template associated with it, but only those templates associated with it. The simplest way to associate templates is to parse them together, something made easier with the new structure of the packages. </p> <p> <em>Updating</em>: The imports will be updated by fix tool. Single-template uses will be otherwise be largely unaffected. Code that uses multiple templates in concert will need to be updated by hand. The <a href="/pkg/text/template/#examples">examples</a> in the documentation for <code>text/template</code> can provide guidance. </p> <h3 id="testing">The testing package</h3> <p> The testing package has a type, <code>B</code>, passed as an argument to benchmark functions. In Go 1, <code>B</code> has new methods, analogous to those of <code>T</code>, enabling logging and failure reporting. </p> <pre><!--{{code "/doc/progs/go1.go" `/func.*Benchmark/` `/^}/`}} -->func BenchmarkSprintf(b *testing.B) { <span class="comment">// Verify correctness before running benchmark.</span> b.StopTimer() got := fmt.Sprintf(&#34;%x&#34;, 23) const expect = &#34;17&#34; if expect != got { b.Fatalf(&#34;expected %q; got %q&#34;, expect, got) } b.StartTimer() for i := 0; i &lt; b.N; i++ { fmt.Sprintf(&#34;%x&#34;, 23) } }</pre> <p> <em>Updating</em>: Existing code is unaffected, although benchmarks that use <code>println</code> or <code>panic</code> should be updated to use the new methods. </p> <h3 id="testing_script">The testing/script package</h3> <p> The testing/script package has been deleted. It was a dreg. </p> <p> <em>Updating</em>: No code is likely to be affected. </p> <h3 id="unsafe">The unsafe package</h3> <p> In Go 1, the functions <code>unsafe.Typeof</code>, <code>unsafe.Reflect</code>, <code>unsafe.Unreflect</code>, <code>unsafe.New</code>, and <code>unsafe.NewArray</code> have been removed; they duplicated safer functionality provided by package <a href="/pkg/reflect/"><code>reflect</code></a>. </p> <p> <em>Updating</em>: Code using these functions must be rewritten to use package <a href="/pkg/reflect/"><code>reflect</code></a>. The changes to <a href="http://code.google.com/p/go/source/detail?r=2646dc956207">encoding/gob</a> and the <a href="http://code.google.com/p/goprotobuf/source/detail?r=5340ad310031">protocol buffer library</a> may be helpful as examples. </p> <h3 id="url">The url package</h3> <p> In Go 1 several fields from the <a href="/pkg/net/url/#URL"><code>url.URL</code></a> type were removed or replaced. </p> <p> The <a href="/pkg/net/url/#URL.String"><code>String</code></a> method now predictably rebuilds an encoded URL string using all of <code>URL</code>'s fields as necessary. The resulting string will also no longer have passwords escaped. </p> <p> The <code>Raw</code> field has been removed. In most cases the <code>String</code> method may be used in its place. </p> <p> The old <code>RawUserinfo</code> field is replaced by the <code>User</code> field, of type <a href="/pkg/net/url/#Userinfo"><code>*net.Userinfo</code></a>. Values of this type may be created using the new <a href="/pkg/net/url/#User"><code>net.User</code></a> and <a href="/pkg/net/url/#UserPassword"><code>net.UserPassword</code></a> functions. The <code>EscapeUserinfo</code> and <code>UnescapeUserinfo</code> functions are also gone. </p> <p> The <code>RawAuthority</code> field has been removed. The same information is available in the <code>Host</code> and <code>User</code> fields. </p> <p> The <code>RawPath</code> field and the <code>EncodedPath</code> method have been removed. The path information in rooted URLs (with a slash following the schema) is now available only in decoded form in the <code>Path</code> field. Occasionally, the encoded data may be required to obtain information that was lost in the decoding process. These cases must be handled by accessing the data the URL was built from. </p> <p> URLs with non-rooted paths, such as <code>"mailto:dev@golang.org?subject=Hi"</code>, are also handled differently. The <code>OpaquePath</code> boolean field has been removed and a new <code>Opaque</code> string field introduced to hold the encoded path for such URLs. In Go 1, the cited URL parses as: </p> <pre> URL{ Scheme: "mailto", Opaque: "dev@golang.org", RawQuery: "subject=Hi", } </pre> <p> A new <a href="/pkg/net/url/#URL.RequestURI"><code>RequestURI</code></a> method was added to <code>URL</code>. </p> <p> The <code>ParseWithReference</code> function has been renamed to <code>ParseWithFragment</code>. </p> <p> <em>Updating</em>: Code that uses the old fields will fail to compile and must be updated by hand. The semantic changes make it difficult for the fix tool to update automatically. </p> <h2 id="cmd_go">The go command</h2> <p> Go 1 introduces the <a href="/cmd/go/">go command</a>, a tool for fetching, building, and installing Go packages and commands. The <code>go</code> command does away with makefiles, instead using Go source code to find dependencies and determine build conditions. Most existing Go programs will no longer require makefiles to be built. </p> <p> See <a href="/doc/code.html">How to Write Go Code</a> for a primer on the <code>go</code> command and the <a href="/cmd/go/">go command documentation</a> for the full details. </p> <p> <em>Updating</em>: Projects that depend on the Go project's old makefile-based build infrastructure (<code>Make.pkg</code>, <code>Make.cmd</code>, and so on) should switch to using the <code>go</code> command for building Go code and, if necessary, rewrite their makefiles to perform any auxiliary build tasks. </p> <h2 id="cmd_cgo">The cgo command</h2> <p> In Go 1, the <a href="/cmd/cgo">cgo command</a> uses a different <code>_cgo_export.h</code> file, which is generated for packages containing <code>//export</code> lines. The <code>_cgo_export.h</code> file now begins with the C preamble comment, so that exported function definitions can use types defined there. This has the effect of compiling the preamble multiple times, so a package using <code>//export</code> must not put function definitions or variable initializations in the C preamble. </p> <h2 id="releases">Packaged releases</h2> <p> One of the most significant changes associated with Go 1 is the availability of prepackaged, downloadable distributions. They are available for many combinations of architecture and operating system (including Windows) and the list will grow. Installation details are described on the <a href="/doc/install">Getting Started</a> page, while the distributions themselves are listed on the <a href="http://code.google.com/p/go/downloads/list">downloads page</a>. </div> <div id="footer"> Build version go1.0.1.<br> Except as <a href="http://code.google.com/policies.html#restrictions">noted</a>, the content of this page is licensed under the Creative Commons Attribution 3.0 License, and code is licensed under a <a href="/LICENSE">BSD license</a>.<br> <a href="/doc/tos.html">Terms of Service</a> | <a href="http://www.google.com/intl/en/privacy/privacy-policy.html">Privacy Policy</a> </div> <script type="text/javascript"> (function() { var ga = document.createElement("script"); ga.type = "text/javascript"; ga.async = true; ga.src = ("https:" == document.location.protocol ? "https://ssl" : "http://www") + ".google-analytics.com/ga.js"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ga, s); })(); </script> </body> <script type="text/javascript"> (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })(); </script> </html> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/example_test.go�������������������������������������������������������������������������0000644�0001751�0001751�00000001512�12235217213�015306� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// 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 example demonstrates parsing HTML data and walking the resulting tree. package html_test import ( "fmt" "log" "strings" "code.google.com/p/go.net/html" ) func ExampleParse() { s := `<p>Links:</p><ul><li><a href="foo">Foo</a><li><a href="/bar/baz">BarBaz</a></ul>` doc, err := html.Parse(strings.NewReader(s)) if err != nil { log.Fatal(err) } var f func(*html.Node) f = func(n *html.Node) { if n.Type == html.ElementNode && n.Data == "a" { for _, a := range n.Attr { if a.Key == "href" { fmt.Println(a.Val) break } } } for c := n.FirstChild; c != nil; c = c.NextSibling { f(c) } } f(doc) // Output: // foo // /bar/baz } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/escape_test.go��������������������������������������������������������������������������0000644�0001751�0001751�00000003535�12235217213�015122� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package html import "testing" type unescapeTest struct { // A short description of the test case. desc string // The HTML text. html string // The unescaped text. unescaped string } var unescapeTests = []unescapeTest{ // Handle no entities. { "copy", "A\ttext\nstring", "A\ttext\nstring", }, // Handle simple named entities. { "simple", "&amp; &gt; &lt;", "& > <", }, // Handle hitting the end of the string. { "stringEnd", "&amp &amp", "& &", }, // Handle entities with two codepoints. { "multiCodepoint", "text &gesl; blah", "text \u22db\ufe00 blah", }, // Handle decimal numeric entities. { "decimalEntity", "Delta = &#916; ", "Delta = Δ ", }, // Handle hexadecimal numeric entities. { "hexadecimalEntity", "Lambda = &#x3bb; = &#X3Bb ", "Lambda = λ = λ ", }, // Handle numeric early termination. { "numericEnds", "&# &#x &#128;43 &copy = &#169f = &#xa9", "&# &#x €43 © = ©f = ©", }, // Handle numeric ISO-8859-1 entity replacements. { "numericReplacements", "Footnote&#x87;", "Footnote‡", }, } func TestUnescape(t *testing.T) { for _, tt := range unescapeTests { unescaped := UnescapeString(tt.html) if unescaped != tt.unescaped { t.Errorf("TestUnescape %s: want %q, got %q", tt.desc, tt.unescaped, unescaped) } } } func TestUnescapeEscape(t *testing.T) { ss := []string{ ``, `abc def`, `a & b`, `a&amp;b`, `a &amp b`, `&quot;`, `"`, `"<&>"`, `&quot;&lt;&amp;&gt;&quot;`, `3&5==1 && 0<1, "0&lt;1", a+acute=&aacute;`, `The special characters are: <, >, &, ' and "`, } for _, s := range ss { if got := UnescapeString(EscapeString(s)); got != s { t.Errorf("got %q want %q", got, s) } } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/node_test.go����������������������������������������������������������������������������0000644�0001751�0001751�00000007305�12235217213�014606� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package html import ( "fmt" ) // checkTreeConsistency checks that a node and its descendants are all // consistent in their parent/child/sibling relationships. func checkTreeConsistency(n *Node) error { return checkTreeConsistency1(n, 0) } func checkTreeConsistency1(n *Node, depth int) error { if depth == 1e4 { return fmt.Errorf("html: tree looks like it contains a cycle") } if err := checkNodeConsistency(n); err != nil { return err } for c := n.FirstChild; c != nil; c = c.NextSibling { if err := checkTreeConsistency1(c, depth+1); err != nil { return err } } return nil } // checkNodeConsistency checks that a node's parent/child/sibling relationships // are consistent. func checkNodeConsistency(n *Node) error { if n == nil { return nil } nParent := 0 for p := n.Parent; p != nil; p = p.Parent { nParent++ if nParent == 1e4 { return fmt.Errorf("html: parent list looks like an infinite loop") } } nForward := 0 for c := n.FirstChild; c != nil; c = c.NextSibling { nForward++ if nForward == 1e6 { return fmt.Errorf("html: forward list of children looks like an infinite loop") } if c.Parent != n { return fmt.Errorf("html: inconsistent child/parent relationship") } } nBackward := 0 for c := n.LastChild; c != nil; c = c.PrevSibling { nBackward++ if nBackward == 1e6 { return fmt.Errorf("html: backward list of children looks like an infinite loop") } if c.Parent != n { return fmt.Errorf("html: inconsistent child/parent relationship") } } if n.Parent != nil { if n.Parent == n { return fmt.Errorf("html: inconsistent parent relationship") } if n.Parent == n.FirstChild { return fmt.Errorf("html: inconsistent parent/first relationship") } if n.Parent == n.LastChild { return fmt.Errorf("html: inconsistent parent/last relationship") } if n.Parent == n.PrevSibling { return fmt.Errorf("html: inconsistent parent/prev relationship") } if n.Parent == n.NextSibling { return fmt.Errorf("html: inconsistent parent/next relationship") } parentHasNAsAChild := false for c := n.Parent.FirstChild; c != nil; c = c.NextSibling { if c == n { parentHasNAsAChild = true break } } if !parentHasNAsAChild { return fmt.Errorf("html: inconsistent parent/child relationship") } } if n.PrevSibling != nil && n.PrevSibling.NextSibling != n { return fmt.Errorf("html: inconsistent prev/next relationship") } if n.NextSibling != nil && n.NextSibling.PrevSibling != n { return fmt.Errorf("html: inconsistent next/prev relationship") } if (n.FirstChild == nil) != (n.LastChild == nil) { return fmt.Errorf("html: inconsistent first/last relationship") } if n.FirstChild != nil && n.FirstChild == n.LastChild { // We have a sole child. if n.FirstChild.PrevSibling != nil || n.FirstChild.NextSibling != nil { return fmt.Errorf("html: inconsistent sole child's sibling relationship") } } seen := map[*Node]bool{} var last *Node for c := n.FirstChild; c != nil; c = c.NextSibling { if seen[c] { return fmt.Errorf("html: inconsistent repeated child") } seen[c] = true last = c } if last != n.LastChild { return fmt.Errorf("html: inconsistent last relationship") } var first *Node for c := n.LastChild; c != nil; c = c.PrevSibling { if !seen[c] { return fmt.Errorf("html: inconsistent missing child") } delete(seen, c) first = c } if first != n.FirstChild { return fmt.Errorf("html: inconsistent first relationship") } if len(seen) != 0 { return fmt.Errorf("html: inconsistent forwards/backwards child list") } return nil } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/foreign.go������������������������������������������������������������������������������0000644�0001751�0001751�00000015401�12235217213�014247� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package html import ( "strings" ) func adjustAttributeNames(aa []Attribute, nameMap map[string]string) { for i := range aa { if newName, ok := nameMap[aa[i].Key]; ok { aa[i].Key = newName } } } func adjustForeignAttributes(aa []Attribute) { for i, a := range aa { if a.Key == "" || a.Key[0] != 'x' { continue } switch a.Key { case "xlink:actuate", "xlink:arcrole", "xlink:href", "xlink:role", "xlink:show", "xlink:title", "xlink:type", "xml:base", "xml:lang", "xml:space", "xmlns:xlink": j := strings.Index(a.Key, ":") aa[i].Namespace = a.Key[:j] aa[i].Key = a.Key[j+1:] } } } func htmlIntegrationPoint(n *Node) bool { if n.Type != ElementNode { return false } switch n.Namespace { case "math": if n.Data == "annotation-xml" { for _, a := range n.Attr { if a.Key == "encoding" { val := strings.ToLower(a.Val) if val == "text/html" || val == "application/xhtml+xml" { return true } } } } case "svg": switch n.Data { case "desc", "foreignObject", "title": return true } } return false } func mathMLTextIntegrationPoint(n *Node) bool { if n.Namespace != "math" { return false } switch n.Data { case "mi", "mo", "mn", "ms", "mtext": return true } return false } // Section 12.2.5.5. var breakout = map[string]bool{ "b": true, "big": true, "blockquote": true, "body": true, "br": true, "center": true, "code": true, "dd": true, "div": true, "dl": true, "dt": true, "em": true, "embed": true, "h1": true, "h2": true, "h3": true, "h4": true, "h5": true, "h6": true, "head": true, "hr": true, "i": true, "img": true, "li": true, "listing": true, "menu": true, "meta": true, "nobr": true, "ol": true, "p": true, "pre": true, "ruby": true, "s": true, "small": true, "span": true, "strong": true, "strike": true, "sub": true, "sup": true, "table": true, "tt": true, "u": true, "ul": true, "var": true, } // Section 12.2.5.5. var svgTagNameAdjustments = map[string]string{ "altglyph": "altGlyph", "altglyphdef": "altGlyphDef", "altglyphitem": "altGlyphItem", "animatecolor": "animateColor", "animatemotion": "animateMotion", "animatetransform": "animateTransform", "clippath": "clipPath", "feblend": "feBlend", "fecolormatrix": "feColorMatrix", "fecomponenttransfer": "feComponentTransfer", "fecomposite": "feComposite", "feconvolvematrix": "feConvolveMatrix", "fediffuselighting": "feDiffuseLighting", "fedisplacementmap": "feDisplacementMap", "fedistantlight": "feDistantLight", "feflood": "feFlood", "fefunca": "feFuncA", "fefuncb": "feFuncB", "fefuncg": "feFuncG", "fefuncr": "feFuncR", "fegaussianblur": "feGaussianBlur", "feimage": "feImage", "femerge": "feMerge", "femergenode": "feMergeNode", "femorphology": "feMorphology", "feoffset": "feOffset", "fepointlight": "fePointLight", "fespecularlighting": "feSpecularLighting", "fespotlight": "feSpotLight", "fetile": "feTile", "feturbulence": "feTurbulence", "foreignobject": "foreignObject", "glyphref": "glyphRef", "lineargradient": "linearGradient", "radialgradient": "radialGradient", "textpath": "textPath", } // Section 12.2.5.1 var mathMLAttributeAdjustments = map[string]string{ "definitionurl": "definitionURL", } var svgAttributeAdjustments = map[string]string{ "attributename": "attributeName", "attributetype": "attributeType", "basefrequency": "baseFrequency", "baseprofile": "baseProfile", "calcmode": "calcMode", "clippathunits": "clipPathUnits", "contentscripttype": "contentScriptType", "contentstyletype": "contentStyleType", "diffuseconstant": "diffuseConstant", "edgemode": "edgeMode", "externalresourcesrequired": "externalResourcesRequired", "filterres": "filterRes", "filterunits": "filterUnits", "glyphref": "glyphRef", "gradienttransform": "gradientTransform", "gradientunits": "gradientUnits", "kernelmatrix": "kernelMatrix", "kernelunitlength": "kernelUnitLength", "keypoints": "keyPoints", "keysplines": "keySplines", "keytimes": "keyTimes", "lengthadjust": "lengthAdjust", "limitingconeangle": "limitingConeAngle", "markerheight": "markerHeight", "markerunits": "markerUnits", "markerwidth": "markerWidth", "maskcontentunits": "maskContentUnits", "maskunits": "maskUnits", "numoctaves": "numOctaves", "pathlength": "pathLength", "patterncontentunits": "patternContentUnits", "patterntransform": "patternTransform", "patternunits": "patternUnits", "pointsatx": "pointsAtX", "pointsaty": "pointsAtY", "pointsatz": "pointsAtZ", "preservealpha": "preserveAlpha", "preserveaspectratio": "preserveAspectRatio", "primitiveunits": "primitiveUnits", "refx": "refX", "refy": "refY", "repeatcount": "repeatCount", "repeatdur": "repeatDur", "requiredextensions": "requiredExtensions", "requiredfeatures": "requiredFeatures", "specularconstant": "specularConstant", "specularexponent": "specularExponent", "spreadmethod": "spreadMethod", "startoffset": "startOffset", "stddeviation": "stdDeviation", "stitchtiles": "stitchTiles", "surfacescale": "surfaceScale", "systemlanguage": "systemLanguage", "tablevalues": "tableValues", "targetx": "targetX", "targety": "targetY", "textlength": "textLength", "viewbox": "viewBox", "viewtarget": "viewTarget", "xchannelselector": "xChannelSelector", "ychannelselector": "yChannelSelector", "zoomandpan": "zoomAndPan", } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/html/escape.go�������������������������������������������������������������������������������0000644�0001751�0001751�00000013733�12235217213�014064� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package html import ( "bytes" "strings" "unicode/utf8" ) // These replacements permit compatibility with old numeric entities that // assumed Windows-1252 encoding. // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#consume-a-character-reference var replacementTable = [...]rune{ '\u20AC', // First entry is what 0x80 should be replaced with. '\u0081', '\u201A', '\u0192', '\u201E', '\u2026', '\u2020', '\u2021', '\u02C6', '\u2030', '\u0160', '\u2039', '\u0152', '\u008D', '\u017D', '\u008F', '\u0090', '\u2018', '\u2019', '\u201C', '\u201D', '\u2022', '\u2013', '\u2014', '\u02DC', '\u2122', '\u0161', '\u203A', '\u0153', '\u009D', '\u017E', '\u0178', // Last entry is 0x9F. // 0x00->'\uFFFD' is handled programmatically. // 0x0D->'\u000D' is a no-op. } // unescapeEntity reads an entity like "&lt;" from b[src:] and writes the // corresponding "<" to b[dst:], returning the incremented dst and src cursors. // Precondition: b[src] == '&' && dst <= src. // attribute should be true if parsing an attribute value. func unescapeEntity(b []byte, dst, src int, attribute bool) (dst1, src1 int) { // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#consume-a-character-reference // i starts at 1 because we already know that s[0] == '&'. i, s := 1, b[src:] if len(s) <= 1 { b[dst] = b[src] return dst + 1, src + 1 } if s[i] == '#' { if len(s) <= 3 { // We need to have at least "&#.". b[dst] = b[src] return dst + 1, src + 1 } i++ c := s[i] hex := false if c == 'x' || c == 'X' { hex = true i++ } x := '\x00' for i < len(s) { c = s[i] i++ if hex { if '0' <= c && c <= '9' { x = 16*x + rune(c) - '0' continue } else if 'a' <= c && c <= 'f' { x = 16*x + rune(c) - 'a' + 10 continue } else if 'A' <= c && c <= 'F' { x = 16*x + rune(c) - 'A' + 10 continue } } else if '0' <= c && c <= '9' { x = 10*x + rune(c) - '0' continue } if c != ';' { i-- } break } if i <= 3 { // No characters matched. b[dst] = b[src] return dst + 1, src + 1 } if 0x80 <= x && x <= 0x9F { // Replace characters from Windows-1252 with UTF-8 equivalents. x = replacementTable[x-0x80] } else if x == 0 || (0xD800 <= x && x <= 0xDFFF) || x > 0x10FFFF { // Replace invalid characters with the replacement character. x = '\uFFFD' } return dst + utf8.EncodeRune(b[dst:], x), src + i } // Consume the maximum number of characters possible, with the // consumed characters matching one of the named references. for i < len(s) { c := s[i] i++ // Lower-cased characters are more common in entities, so we check for them first. if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' { continue } if c != ';' { i-- } break } entityName := string(s[1:i]) if entityName == "" { // No-op. } else if attribute && entityName[len(entityName)-1] != ';' && len(s) > i && s[i] == '=' { // No-op. } else if x := entity[entityName]; x != 0 { return dst + utf8.EncodeRune(b[dst:], x), src + i } else if x := entity2[entityName]; x[0] != 0 { dst1 := dst + utf8.EncodeRune(b[dst:], x[0]) return dst1 + utf8.EncodeRune(b[dst1:], x[1]), src + i } else if !attribute { maxLen := len(entityName) - 1 if maxLen > longestEntityWithoutSemicolon { maxLen = longestEntityWithoutSemicolon } for j := maxLen; j > 1; j-- { if x := entity[entityName[:j]]; x != 0 { return dst + utf8.EncodeRune(b[dst:], x), src + j + 1 } } } dst1, src1 = dst+i, src+i copy(b[dst:dst1], b[src:src1]) return dst1, src1 } // unescape unescapes b's entities in-place, so that "a&lt;b" becomes "a<b". // attribute should be true if parsing an attribute value. func unescape(b []byte, attribute bool) []byte { for i, c := range b { if c == '&' { dst, src := unescapeEntity(b, i, i, attribute) for src < len(b) { c := b[src] if c == '&' { dst, src = unescapeEntity(b, dst, src, attribute) } else { b[dst] = c dst, src = dst+1, src+1 } } return b[0:dst] } } return b } // lower lower-cases the A-Z bytes in b in-place, so that "aBc" becomes "abc". func lower(b []byte) []byte { for i, c := range b { if 'A' <= c && c <= 'Z' { b[i] = c + 'a' - 'A' } } return b } const escapedChars = "&'<>\"\r" func escape(w writer, s string) error { i := strings.IndexAny(s, escapedChars) for i != -1 { if _, err := w.WriteString(s[:i]); err != nil { return err } var esc string switch s[i] { case '&': esc = "&amp;" case '\'': // "&#39;" is shorter than "&apos;" and apos was not in HTML until HTML5. esc = "&#39;" case '<': esc = "&lt;" case '>': esc = "&gt;" case '"': // "&#34;" is shorter than "&quot;". esc = "&#34;" case '\r': esc = "&#13;" default: panic("unrecognized escape character") } s = s[i+1:] if _, err := w.WriteString(esc); err != nil { return err } i = strings.IndexAny(s, escapedChars) } _, err := w.WriteString(s) return err } // EscapeString escapes special characters like "<" to become "&lt;". It // escapes only five such characters: <, >, &, ' and ". // UnescapeString(EscapeString(s)) == s always holds, but the converse isn't // always true. func EscapeString(s string) string { if strings.IndexAny(s, escapedChars) == -1 { return s } var buf bytes.Buffer escape(&buf, s) return buf.String() } // UnescapeString unescapes entities like "&lt;" to become "<". It unescapes a // larger range of entities than EscapeString escapes. For example, "&aacute;" // unescapes to "á", as does "&#225;" and "&xE1;". // UnescapeString(EscapeString(s)) == s always holds, but the converse isn't // always true. func UnescapeString(s string) string { for _, c := range s { if c == '&' { return string(unescape([]byte(s), false)) } } return s } �������������������������������������go.net/netutil/�������������������������������������������������������������������������������������0000755�0001751�0001751�00000000000�12235217213�013006� 5����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/netutil/listen_test.go�����������������������������������������������������������������������0000644�0001751�0001751�00000002430�12235217213�015671� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package netutil import ( "fmt" "io" "io/ioutil" "net" "net/http" "sync" "sync/atomic" "testing" "time" ) func TestLimitListener(t *testing.T) { const ( max = 5 num = 200 ) l, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { t.Fatalf("Listen: %v", err) } defer l.Close() l = LimitListener(l, max) var open int32 go http.Serve(l, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if n := atomic.AddInt32(&open, 1); n > max { t.Errorf("%d open connections, want <= %d", n, max) } defer atomic.AddInt32(&open, -1) time.Sleep(10 * time.Millisecond) fmt.Fprint(w, "some body") })) var wg sync.WaitGroup var failed int32 for i := 0; i < num; i++ { wg.Add(1) go func() { defer wg.Done() r, err := http.Get("http://" + l.Addr().String()) if err != nil { t.Logf("Get: %v", err) atomic.AddInt32(&failed, 1) return } defer r.Body.Close() io.Copy(ioutil.Discard, r.Body) }() } wg.Wait() // We expect some Gets to fail as the kernel's accept queue is filled, // but most should succeed. if failed >= num/2 { t.Errorf("too many Gets failed") } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/netutil/listen.go����������������������������������������������������������������������������0000644�0001751�0001751�00000002044�12235217213�014633� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package netutil provides network utility functions, complementing the more // common ones in the net package. package netutil import ( "net" "sync" ) // LimitListener returns a Listener that accepts at most n simultaneous // connections from the provided Listener. func LimitListener(l net.Listener, n int) net.Listener { ch := make(chan struct{}, n) for i := 0; i < n; i++ { ch <- struct{}{} } return &limitListener{l, ch} } type limitListener struct { net.Listener ch chan struct{} } func (l *limitListener) Accept() (net.Conn, error) { <-l.ch c, err := l.Listener.Accept() if err != nil { return nil, err } return &limitListenerConn{Conn: c, ch: l.ch}, nil } type limitListenerConn struct { net.Conn ch chan<- struct{} close sync.Once } func (l *limitListenerConn) Close() error { err := l.Conn.Close() l.close.Do(func() { l.ch <- struct{}{} }) return err } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/codereview.cfg�������������������������������������������������������������������������������0000644�0001751�0001751�00000000136�12235217213�014137� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������defaultcc: golang-dev@googlegroups.com contributors: http://go.googlecode.com/hg/CONTRIBUTORS ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/publicsuffix/��������������������������������������������������������������������������������0000755�0001751�0001751�00000000000�12235217213�014025� 5����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/publicsuffix/table.go������������������������������������������������������������������������0000644�0001751�0001751�00001505541�12235217213�015456� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// generated by go run gen.go; DO NOT EDIT package publicsuffix const version = "publicsuffix.org's effective_tld_names.dat, hg revision 9767cf9a0150 (2013-10-15)" const ( nodesBitsChildren = 9 nodesBitsICANN = 1 nodesBitsTextOffset = 15 nodesBitsTextLength = 6 childrenBitsWildcard = 1 childrenBitsNodeType = 2 childrenBitsHi = 14 childrenBitsLo = 14 ) const ( nodeTypeNormal = 0 nodeTypeException = 1 nodeTypeParentOnly = 2 ) // numTLD is the number of top level domains. const numTLD = 369 // Text is the combined text of all labels. const text = "bielawashingtondcasertaishinomakikugawatchandclockasaokaminokawa" + "nishiaizubangexeterbiellaakesvuemieleccertificationaturalscience" + "snaturelles3-us-west-1bieszczadygeyachiyodabievat-band-campobass" + "obetsuldalvdalaskanittedalaheadjudygarlandrobakrehamnaturbruksgy" + "mnaturhistorisches3-us-west-2bifukagawassamukawatarikuzentakatai" + "rabihorologyonagoyabikedabilbaogakievenassisibenikihokumakogeneb" + "akkeshibechambagricultureklambulancechirebungoonomichinomiyakemb" + "uchikujoetsuruokafjordyndns-at-workinggroupowiatambovaroyonaguni" + "versityumenatuurwetenschappenaumburglassassinational-library-sco" + "tlandes3-website-ap-northeast-1billustrationaustdalosangeles3-we" + "bsite-ap-southeast-1biohtawaramotoineppulminamidaitomanmobileirv" + "ikashibatakarazukaminoyamatsuriiyamanobeeldengeluidyndns-blogdns" + "3-website-ap-southeast-2birdartdecoaloteneindianapolis-a-blogger" + "birkenesoddtangenoamishirasatodayoriikashiharabirthplacexhibitio" + "navalouvrexpressexyukuhashimoichinosekigaharabjarkoyurihonjolszt" + "ynsettlers3-website-eu-west-1bjerkreimperiabjugnavigationavuotna" + "kanotoddenawrastelecomoldebmdyndns-freemasonryusuharabolzanordla" + "ndyndns-homeftpaccess3-website-sa-east-1bomloabaths3-website-us-" + "east-1bonnayoromutashinaindianmarketplacebostonakijinsekikogenov" + "arabotanicalgardenvironmentalconservationikkoebenhavnikolaevenes" + "sebyglandyndns-ipalermomanposts-and-telecommunications3-website-" + "us-gov-west-1botanicgardeninomiyakonojournalismolenskashiwarabot" + "anycasinordre-landyndns-mailowiczest-a-la-maisondre-landyndns-of" + "fice-on-the-webhopocznorilskashiwazakiyosumitakaginozawaonsenira" + "sakinfoggiabozentsujiiebrandywinevalleyusuissembokumamotoyamatsu" + "motofukebrasiljan-mayenishiawakurabremangerbresciabrindisiellaka" + "samatsudonnagatorokunohealthruhereggiocalabriabristolgamvikasuka" + "beiarndyndns-picsiroroskolegnicagliaridagawatch-and-clockasumiga" + "urawa-mazowszexchangebritish-libraryazannakadomari-elasticbeanst" + "alkasuyanagawabritishcolumbialowiezachpomorskienishiazainsurance" + "broadcastleasingles3-website-us-west-1broke-itarantokyotangoslop" + "padovanylvenicebrokerbronnoysundyndns-remoteginankokubunjintelli" + "gencebrumunddaluccarbonia-iglesias-carboniaiglesiascarboniabrune" + "lblagdenesnaaseralingenkainanaejrietipschlesischest-mon-blogueur" + "brussels3-website-us-west-2bruxellesjamalborkangerbryanskleppalm" + "springsakerbrynewjerseyuulsandoyuzawabuzz-2bvballooninggfarmerse" + "inebinosegawaustraliastronomyokohamamatsudaejeonbukareliaostalba" + "nsnasabaerobaticarrierbwegrowestfalenishigotembaixadabzgoracityd" + "aluroycivilaviationishinomiyashironostrowwlkpanamacivilisationis" + "hinoomotegotsukisofukushimarburgloppenzamamidsundyndns-workshopp" + "dalustercivilizationishinoshimacivilwarmiasakuchinotsuchiurakawa" + "clintonoshoesalangenishiokoppegardyroyclothingminakamichigangwon" + "ishitosashimizunaminamiawajikis-a-conservativefsnillfjordcloudco" + "ntrolledogawarabikomaezakirunorfolkebibleborkdalutskazimierz-dol" + "nycloudfrontariodejaneiromskoguchikuzenishiwakis-a-cpaderborniss" + "edaluxembourgqcatanzarowfarmsteadyndns-serverbaniacntarumizusawa" + "coloradoplateaukraanghkemerovoldavvenjargalsadoesntexisteingeeka" + "zoologycolumbusantiquesalatatarstanisshingouvicenzaogashimadachi" + "cagobodoes-itateshinanomachildrensgardeniyodogawacompute-1comput" + "erhistoryofscience-fictionlsaltdaluzernrwritesthisblogspotateyam" + "aconferenceconstructionconsuladoomdnsaliascolipicenord-aurdalto-" + "adigeelvinckazunoconsultanthropologyconsultingvollvivcateringebu" + "nkyonanaoshimabariaketrzynishiharacontemporaryartgalleryggets-it" + "atsunocontractorskenconventureshinodesashibetsuikimobetsurutahar" + "acooperaunitelevisioncopenhagentsalvadordalillehammerfest-le-pat" + "rondheiminamiiserniacorporationcorvettexasiacosenzagannefrankfur" + "tattoocostumedicaltanissettaitogitsulikes-piecountysfjordcqhabor" + "ovnotogawacranbrookuwanamizuhobby-sitextilebtimnetzgorzeleccolon" + "ialwilliamsburgretajimakanegasakisosakitagatakaharussiacremonash" + "orokanaiecrewroclawwwcrimeacrotonewyorkshirepbodynathomebuiltaxi" + "s-a-bruinsfanculturalcentertainmentgorycuneocxn--3bst00minamiizu" + "kamisunagawacymruovatmparachutingrimstadfhvalerfieldfigueresalzb" + "urgrossetouchijiwadepotaruis-a-cubicle-slaveroyrviknakanojoshkar" + "-olangevagsoyfilateliafilminamimakis-a-democratjeldsundfineartsa" + "megawafinlandfinnoyfirenzefirminamiminowafitjarchitecturennebude" + "jjuedischesapeakebayfjalerdalflekkefjordflesbergenflightinground" + "handlingroznyflogisticsamnangerfloraflorencefloridaflorovigoogle" + "apisa-geekgrparaglidingruenoharafndfolldalfor-better-thanawafor-" + "ourfor-somedio-campidano-mediocampidanomediofor-thedmarkhabarovs" + "khakassiaforceforgotdnsanfranciscollectionforli-cesena-forlicese" + "naforlikescandyndns-at-homednsangoforsandasuolodingenfortmissoul" + "an-udell-ogliastrakhanamigawafortworthachijorpelandforuminamiogu" + "nionfosnesanjournalistavernfotherokusslattuminamisanrikubetsurge" + "onshalloffameldalfredrikstadaokagakirafreiburgulenfreightjomeloy" + "alistavropolkowicefribourgunmarnardalfrognfrolandfrom-akuneuesan" + "nanfrom-alfrom-arqldfrom-azgradfrom-cambridgetmyiparisor-fronfro" + "m-coldwarszawafrom-ctownfrom-dcharterfrom-dellogliastraderfrom-f" + "lakstadtoyakokamiokamikitayamatotakadafrom-gausdalfrom-hichisoft" + "waremarkerfrom-iafrom-idfrom-ilfrom-incheonfrom-ksannohemnesanta" + "barbarafrom-kyotobetsuwanouchikushinonsennanburyatiafrom-lahppia" + "cenzakopanefrom-mannoshirooshikamaishimodatefrom-mdfrom-medizinh" + "istorischesantacruzhgorodfrom-microlightoyokawafrom-mnfrom-mochi" + "zukirkenesantafedjelenia-gorafrom-msanukis-a-designerfrom-mtoyon" + "akagyokutomaritimekeepinguovdageaidnurembergushikamifuranotaires" + "aotomelhusdecorativeartsapporofrom-nchattanooganordreisa-hockeyn" + "utazulvikaszubytomakomaibarafrom-ndfrom-nefrom-nhachinoheguris-a" + "-doctorfrom-njessheiminamitanefrom-nminamiuonumatsusakahogis-a-f" + "inancialadvisor-aurdalfrom-nvdonskharkivguernseyfrom-nyfrom-ohda" + "from-oketogooglecodespotoyonezawafrom-orlandfrom-pacificheltenha" + "m-radio-openair-surveillancefrom-prdfrom-rissagaeroclubindallasp" + "eziamallamadridvrdnsdojobojis-a-geekharkovenneslaskerfrom-schoen" + "brunnfrom-sdfrom-tnfrom-txn--3ds443gwangjurfrom-utsiracusagamiha" + "rafrom-vadsogndalfrom-vtoyonofrom-wafrom-wielunnerfrom-wveronams" + "osnowiechelyabinskodjeffersongfest-a-la-masionishiizunazukinuyam" + "anouchikuhokuryugasakitaurayasudafrom-wyfrosinonefrostargardfroy" + "aitaiwanaip6boneat-urlewismillerhcloudcontrolappalace-burg12000f" + "starostwodzislawfujiiderafujikawaguchikonefujiminohkurafujinomiy" + "adafujiokayamansionsaratoverranfujisatoshonaircraftoyookanrafuji" + "sawafujishiroishidakabiratoridelmenhorstalowa-wolawafujiyoshidaf" + "ukayabeardudinkakegawalesundfukuchiyamadafukudominicherkasydneyu" + "zhno-sakhalinskatowicefukuis-a-greenfukumitsukefukuokazakirovogr" + "adoyfukuroishigakiryufuefukihabikinokawair-traffic-controlleyfuk" + "usakisarazunjargafukuyamagatajimidorittogurafunabashiriuchinadaf" + "unagatajiris-a-gurunsakatakatsukis-a-hard-workerfunahashikamiama" + "kusatsumasendaisenfundaciofuoiskujitawarafuosskoczowfurniturevie" + "wsarpsborgxn--3e0b707efurubiraquariuminamiyamashirokawanabellevu" + "edavvesiidazaifudaigodollsarufutsunomiyawakasaikaitakoelnfurudon" + "ostiafurukawaharafusognefussaikishiwadafutabayamaguchinomigawafu" + "tboldlygoingnowhere-for-moregontrailroadfuttsunanjohanamakinohar" + "afylkesbiblfyresdalhakubanhakuis-a-hunterhakusandnessjoenhaldenh" + "alsaintlouis-a-anarchistoirehammarfeastafricamerakershuscountrye" + "stateofdelawarezzoologicalhamurakamigoris-a-knightoyotaris-a-lan" + "dscaperugiahangglidingzhytomyrhannanmokuizumodellinghannoverhall" + "ancashirehanyuzenhapmirkutskhmelnitskiyamassa-carrara-massacarra" + "ramassabuyshousesasayamahappoumuenchenhareidsbergbauernunzenhars" + "tadharvestcelebrationhasamarahasaminami-alpsienakamuratakamoriok" + "amakurazakitahiroshimarugame-hostre-totenkawahasudahasvikhmelnyt" + "skyiversaillesaseboknowsitallhatogayakagehatoyamazakitakamiizumi" + "sanoksnesaskatchewanhatsukaichiharahattfjelldalhawaiijimarumorim" + "achidahayashimamotobusheyhazuminobusenetoyotomiyazakis-a-lawyerh" + "emsedalheroyhigashichichibuskerudinewmexicodynaliascoli-picenono" + "ichikawamisatobishimaizurubtsovskjaknoluoktainaikawababia-gorakk" + "estadultoyotsukaidohigashihiroshimanehigashiizumozakitamidtre-ga" + "uldalhigashikagawahigashikagurasoedahigashikawakitaaikitamotosum" + "idatlantichernigovernmentargis-a-bulls-fanishikatakasugais-a-can" + "didatehigashikurumeeresassaris-a-liberalhigashimatsushimarylandh" + "igashimatsuyamakitaakitadaitoigawahigashimurayamalatvuopmifunehi" + "gashinarusells-for-lessatxn--45brj9chernihivanovosibirskydivingl" + "iwicehigashinehigashiomihachimanchesterhigashiosakasayamamotorcy" + "cleikangerhigashishirakawamatakanezawahigashisumiyoshikawaminami" + "aikitanakagusukumodenakaniikawatanagurahigashitsunohigashiurausu" + "kitashiobarahigashiyamatokoriyamanakakogawahigashiyodogawahigash" + "iyoshinogaris-a-libertarianhiraizumisatohmarylhurstathelleirfjor" + "dhirakatashinagawahiranairlinemurorankoshigayachimatagajobsaudah" + "irarahiratsukagawahirayakumodernhistorichousesauheradhitachiomiy" + "aginowaniigatakahamantovaksdalhitachiotagoparmahitoyoshimihamada" + "hitradinghjartdalhjelmelandholdingsmolajollanbibaidarholeckobier" + "zycehomelinuxn--4gbrimininghomeunixn--54b7fta0cchernivtsiemenswe" + "denishikatsuragis-a-catererhongorgehonjyoichiropractichernovtsyk" + "kylveneziahornindalhortendofinternetoyourahoteledatabaseballange" + "nhoyangerhoylandetroitozawahuissier-justicehumanitiesavannahgahu" + "rdalhurumajis-a-linux-useranishiaritabashiibahccavuotnagaravenna" + "gareyamalopolskanlandhyugawaraissmarterthanyouthachiojiyaizuwaka" + "matsubushikusakadogawaiwatarailwayiwateiwatsukiyonojfklabuzenjgo" + "rajpnkoryolbia-tempio-olbiatempioolbialystokkekosaigawakosakaero" + "dromedecinemagadanconagawakayamagazinedre-eikerimo-i-ranaamesjev" + "uemielnoboribetsuitachikawakeisenbahnkoseis-a-nursells-for-usgar" + "denkoshimizumakis-a-painteractivegarsheiheijis-a-llamasfjordenko" + "shunantokamachippubetsubetsugarustkanzakiyosatohokkaidoshibuyaha" + "baghdadkostromahabmerkosugekotohiradomurakotourakouhokutamakis-a" + "-patsfankounosumypetscientisteigenkouyamateramodumincommunitysva" + "rdokouzushimatsumaebashikaois-a-personaltrainerkozagawakozakis-a" + "-photographerokuappspotenzaporizhzhelsinkitakatakanabedzin-addra" + "mmenuernbergkrageroticapebretonamibungotakadakrakowkrasnoyarskol" + "obrzegersundkristiansandefjordkristiansundkrodsheradkrokstadelva" + "ntaakryminnesotaketakashimatsushigekumatorinokumejimatsunokumena" + "nyokaichibaikaliszkola-speziakunisakis-a-playerkunitachiaraisaij" + "osoyrokunitomigusukukis-a-republicanadakunneppuwajimakunstsammlu" + "ngkunstunddesignkurekurgankurobelgorodoystre-slidrettravellinoku" + "rogimimatakasagorlicekuroisojaworznokuromatsunairportland-4-sale" + "rnogataikicks-assedichiryuoharuhrkurotakikawasakis-a-rockstarach" + "owicekurskomaganekushirogawakustanairtraffichitachinakagawawhali" + "nglobalatinabeauxartsandcraftsakurais-a-celticsfanishikawazukana" + "nporostrodakusunndalkutchandakutnokuzbassnoasaitamatsukuris-a-so" + "cialistationkuzumakis-a-soxfankvafjordkvalsundkvamsterdamberkele" + "ykvanangenkvinesdalkvinnheradkviteseidskogkvitsoykwkyowariasahik" + "awakyuragithubalsfjordlugolekaluganskarlsoyokotehimejibigawautho" + "rdalandiscoveryokosukaratsuginamikatagamilanobihirosakikamijimau" + "rskog-holandirectoryokamikawanehonbetsurugildeskalmykiaosteroyke" + "nglandgcahcesuolocalhistorybnikahokutoeigersundielddanuorringeri" + "ke164misugitokashikis-a-techietis-a-musicianmitakeharamitourismi" + "sakis-a-studentozsdemitoyoakemiuramiyazumiyotamanomjondalenmombe" + "tsurgutrdmoneyagawamonmouthachirogatakahashimamakitagawamonticel" + "londonetskomakizunokunimilitarymontrealestatecouncilmonza-brianz" + "amonza-e-della-brianzamonzabrianzamonzaebrianzamonzaedellabrianz" + "amordoviamoriyamatsuzakis-a-therapistoiamoriyoshiokamitondabayas" + "hiogamagoriziamoroyamatta-varjjatreemoscowmoseushistorymosjoenmo" + "skenescrapper-sitemosreggio-calabriamosscrappingmosvikomatsushim" + "asudamuenstermugis-an-accountantranaklodzkodairamuikamitsuemukoc" + "hikuseihigashiagatsumagoizumizakitakyushuaiamulhousells-itrentin" + "omunakatanemuncieszynmuosattemurmanskomforbalsanagochihayaakasak" + "awagoebizenakamagayahikobearalvahkikuchikumagayagawalbrzychampio" + "nshipalanakasatsunaibestadivttasvuotnakaiwamizawaustrheimatunduh" + "rennesoygardeniwaizumiotsukumiyamazonaws3-ap-northeast-1murotorc" + "raftrentomskomitamamuramusashimurayamamusashinoharamuseetrevisol" + "aquilapyatigorskommunalforbundmuseumverenigingmutsuzawamyphotosh" + "imamytis-a-bookkeepermisasaguris-a-teacherkassypassenger-associa" + "tionpaviapescarapharmacienseminepharmacyberlevagangaviikarugaula" + "rdalphiladelphiaareadmyblogsitephilatelyphoenixn--6frz82gphotogr" + "aphyogoris-an-actressaves-the-whalessandria-trani-barletta-andri" + "atranibarlettaandriapilotseoullensakerpinkzlgpippupiszmisawapitt" + "sburghofcfarsundyndns-webetsukubahcavuotnagaokakyotambadajozorau" + "mallorcadaquesakuragawapkommuneplanetariumisconfusedplantationpl" + "antservebbserveftparochesterplazaplchitosetogakushimotoganewport" + "lligatewayplorenskogplumbingpodhaleksvikomonopodlasiedlcepodzone" + "poltavaresearchaeologicalpomorzeszowpordenoneporsangerporsanguid" + "eporsgrunnanpoznanpreservationpresidioprincipesaro-urbino-pesaro" + "urbinopesaromantelekommunikationprivneprochowiceproductionprofer" + "mobaraprojectriesteamurskiptveterinaireggio-emiliapruszkowprzewo" + "rskogptzpartis-an-actorpvtroandinosaurepwpzwqsldshimonosekikawas" + "himosuwalkis-an-entertainershimotsukeshimotsumashingujolstershin" + "ichinanshinjoyoitakaokamchatkameokameyamashinashikiwildlifederat" + "ionshinjukumanoshinkamigotoyohashimotokorozawashinshinotsusakis-" + "byklebesbydgoszczecincinnationalfirearmsayokkaichirurgiens-denti" + "steshikagamiishikarikaturindalshinshiroshintokushimashintomikasa" + "harashinyoshitomiokaneyamazoeshiojirishirifujiedashioyanaizushir" + "ahamatonbetsusonoshirakoenigshiranukaniepceshiraois-certifieduca" + "torahimeshimageandsoundandvisionshiraokanmakiyokawarashiratakaha" + "gis-foundationshishikuis-goneshisokndalshisuifuettertdasnetzshit" + "aramashizukuishimofusaitokonamegatakatoris-into-animeguroshizuok" + "annamihoboleslawiechocolatelemarkatsushikabelaugustowadagestange" + "ologyshowasigdalsimbirskomvuxn--55qx5dsimple-urlsirdalslgslupsko" + "vestfoldsnzsolundsomasvuotnakayamasomnakhodkamogawasoosopotromsa" + "kakinokis-into-carschokoladensor-odalsor-varangersorfoldsorreisa" + "hayakawakamiichikaiseiyokoshibahikariwanumatakayamasortlandsorum" + "ishimatsuurasouthcarolinazawasouthwesterniiminamiashigarasowaspa" + "ce-to-rentromsolognespbaltimore-og-romsdalindaskimitsubatamiasta" + "rnbergjemnes3-ap-southeast-2spjelkavikonantanangerspydebergsquar" + "endalenvikingatlantakazakis-into-cartoonschoolkuszjetranbysrvest" + "neserviceservegame-servercellillesandiegoshikiminokamoenairguard" + "steinkjerusalembetsukuis-into-gamesaverdestjohnstjordalshalsenst" + "ockholmestrandstor-elvdalstordalstorenburgstorfjordstpetersburgs" + "tuff-4-salevangerstuttgartrusteesuzukanoyaltaijis-leetrani-andri" + "a-barletta-trani-andriasvalbardurhamburgsveiosvelvikongsbergsviz" + "zeraswidnicareersettsurreyswiebodzinderoyswinoujscienceandhistor" + "ysxn--6qq986b3xlvestre-totenris-lostfoldvestvagoyvevelstadvibo-v" + "alentiavibovalentiavideovinnicargojomediaphonefosshnvinnytsiavir" + "giniavirtualvirtuelviterboltularssonvladikavkazanvladimirumasaki" + "tchenvladivostokaizukarasjohkamiminershacknetrogstadvlogvolgogra" + "dvolkenkunderseaporturystykanumazuryvologdanskoninohembygdsforbu" + "ndvolyngdalvoronezhitomirvossevangenvrnvyatkarasjokonskowolansci" + "encecentersciencehistoryxn--9dbhblg6diamondshakotankomorotsukami" + "satohnoshooxn--andy-iraxn--aroport-byaotsuzakanonjis-not-certifi" + "edunetnedalxn--asky-iraxn--aurskog-hland-jnbarcelonagasakikonaio" + "irasecngjerdrumemorialinzaishobarakpetroleumessinatsukigatakasak" + "iheyakutiautomotivelandivtasvuodnaharimaniwakuratebinagisodegaur" + "austevollimanowarudasmatartcenterprisesakijogaszczytnord-odaltoa" + "digeiseiroudaegubalestrandabergamoarekepnorddalezajsk-uralsk12xn" + "--avery-yuasakegawaxn--b-5gaxn--bdddj-mrabdxn--bearalvhki-y4axn-" + "-berlevg-jxaxn--bhcavuotna-s4axn--bhccavuotna-k7axn--bidr-5nachi" + "katsuuraxn--bievt-0qaxn--bjarky-fyaroslavlaanderenxn--bjddar-pta" + "kinouexn--blt-elaborxn--bmlo-grajewolominamataketomisatokuyamaxn" + "--bod-2namsskoganeis-savedxn--brnny-wuaccident-investigationjuku" + "doyamaceratabusebastopologyeongbukooris-a-nascarfanxn--brnnysund" + "-m8accident-preventionlinebraskaunbieidsvollxn--brum-voagatuvarg" + "gatrysilkongsvingerxn--btsfjord-9zaxn--cg4bkis-slickhvestbyxn--c" + "iqpnxn--clchc0ea0b2g2a9gcdxn--comunicaes-v6a2oxn--correios-e-tel" + "ecomunicaes-ghc29axn--czrw28barreaudnedalnasushiobaravocataniaus" + "tinnarvikariyameiwamashikokuchuobanazawasnesoddenmarkhangelskjer" + "voyagemologicaliforniaomoriguchiharamliernewhampshirecreationarv" + "iikanagawaeroportalabamagasakishimabarahkkeravjudaicaarborteache" + "s-yogasawaragusartsaritsynarutokigawagrinethnologyekaterinburgdy" + "niagroks-theaternopilawakuyabukibichuozudmurtiamusementakkofuelv" + "erumbone12xn--davvenjrga-y4axn--dnna-grandrapidsharis-an-anarchi" + "storicalsocietysnesavonakatsugawaxn--drbak-wuaxn--dyry-iraxn--ev" + "eni-0qa01gaxn--finny-yuaxn--fiq228c5hshellaskoyabenord-fronxn--f" + "iq64barrel-of-knowledgeometre-experts-comptables3-fips-us-gov-we" + "st-1xn--fiqs8sherbrookegawaxn--fiqz9shimojis-an-artistavangerxn-" + "-fjord-lraxn--fl-ziaxn--flor-jraxn--fpcrj9c3dxn--frde-granexn--f" + "rna-woarais-uberleetraniandriabarlettatraniandriaxn--frya-hraxn-" + "-fzc2c9e2chofunatoristanore-og-uvdalucernexn--gecrj9chonangonohe" + "jis-a-chefastlyxn--ggaviika-8ya47hadanotteroyxn--gildeskl-g0axn-" + "-givuotna-8yasakaiminatonsbergxn--gjvik-wuaxn--gls-elachoseikaku" + "damatsuedtirollagrarboretuminamiechizenishimeraxn--gmq050is-very" + "-badaddjamisongdalenxn--gmqw5axn--h-2familyngenxn--h1aeghadselfi" + "parliamentoyosatomobeneventochiokinoshimalvikhersoniikappulawyxn" + "--h2brj9choshibukawaxn--hbmer-xqaxn--hcesuolo-7ya35barrell-of-kn" + "owledgeorgiavoues3-ap-southeast-1xn--hery-iraxn--hgebostad-g3axn" + "--hmmrfeasta-s4achoyodontexistmein-the-bandaiwafunewspaperxn--hn" + "efoss-q1axn--hobl-iraxn--holtlen-hxaxn--hpmir-xqaxn--hyanger-q1a" + "xn--hylandet-54axn--indery-fyasugis-very-evillagematsubarakawach" + "inaganoharaokinawashirosatobamagnitkagaminogiessengerdalstahauge" + "sundxn--io0a7is-very-gooddaxn--j1amhaebaruminanoxn--j6w193gxn--j" + "lster-byasuokarasuyamashikiyosemitexn--jrpeland-54axn--karmy-yua" + "xn--kfjord-iuaxn--klbu-woaxn--koluokta-7ya57hagaxn--kprw13dxn--k" + "pry57dxn--krager-gyatominamibosokamishihoronobeokamikoaniihamata" + "makawajimashikexn--kranghke-b0axn--krdsherad-m8axn--krehamn-dxax" + "n--krjohka-hwab49jevnakerxn--ksnes-uuaxn--kvfjord-nxaxn--kvitsy-" + "fyatsukaratexn--kvnangen-k0axn--l-1fareastcoastaldefencexn--lahe" + "adju-7yatsushiroxn--langevg-jxaxn--lcvr32dxn--ldingen-q1axn--lea" + "gaviika-52baselburgjerstadotsurugashimanxjeonnamerikawauembroide" + "ryokozemergencyclopedicartoonarteducationalchikugokasejnynysafet" + "ychyllestadnepropetrovskarmoyomitanobiraxn--lesund-huaxn--lgbbat" + "1ad8jewelryxn--lgrd-poachtraeumtgeradefenseljejuifauskedsmokorse" + "ttlementarnobrzegyptianpachigasakidsakyotanabellunordkappglogowi" + "ndmillukowloclawekatsuyamasoyxn--lhppi-xqaxn--linds-pratottoris-" + "very-nicexn--lns-qlarvikopervikmschweizhevskokonoexn--loabt-0qax" + "n--lrdal-sraxn--lrenskog-54axn--lt-liachungbukautokeinostrolekan" + "azawaxn--lten-granvindafjordxn--lury-iraxn--mely-iraxn--merker-k" + "uaxn--mgb2ddeshimokawaxn--mgb9awbferraraxn--mgba3a4f16axn--mgba3" + "a4franapleshimokitayamaxn--mgbaam7a8hagebostadxn--mgbayh7gpaduax" + "n--mgbbh1a71exn--mgbc0a9azcgxn--mgberp4a5d4a87gxn--mgberp4a5d4ar" + "xn--mgbqly7c0a67fbchungnamdalseidfjordyndns-wikinkobayashijonawa" + "texn--mgbqly7cvafranziskanerimarinexn--mgbtf8flandershimonitayan" + "agis-an-engineerxn--mjndalen-64axn--mk0axis-very-sweetranoyxn--m" + "latvuopmi-s4axn--mli-tlavagiskexn--mlselv-iuaxn--moreke-juaxn--m" + "osjen-eyawaraxn--mot-tlavangenxn--mre-og-romsdal-qqbashkiriaxn--" + "msy-ula0haibarakitahatakahatakaishimogosenxn--mtta-vrjjat-k7afet" + "sundxn--muost-0qaxn--mxtq1missileitungsenxn--ngbc5azdxn--nmesjev" + "uemie-tcbajddarchaeologyxn--nnx388axn--nodessakuhokksundxn--nry-" + "yla5gxn--nttery-byaesellsyourhomeipasadenakatombetsurnadalxn--nv" + "uotna-hwaxn--o3cw4hakatanohatakamatsukawaxn--od0algxn--od0aq3bat" + "ochigifuchukotkakamigaharaxn--ogbpf8flatangerxn--oppegrd-ixaxn--" + "ostery-fyawatahamaxn--osyro-wuaxn--p1ais-with-thebandovre-eikerx" + "n--pgbs0dhakodatexn--porsgu-sta26fgroks-thisayamanashichikashuku" + "jukuriyamaritimodalenxn--q9jyb4chuvashiaxn--rady-iraxn--rdal-poa" + "xn--rde-ulaxn--rdy-0nabarisleofmandalxn--rennesy-v1axn--rhkkervj" + "u-01afhskchristiansburgrongaxn--rholt-mragoworse-thandsondrioxn-" + "-rhqv96gxn--risa-5narashinoxn--risr-iraxn--rland-uuaxn--rlingen-" + "mxaxn--rmskog-byaxn--rros-gratangenxn--rskog-uuaxn--rst-0naritak" + "urashikisshikiwakunigamiharuslivinghistoryxn--rsta-francaisehara" + "xn--ryken-vuaxn--ryrvik-byaxn--s-1farmequipmentverdalxn--s9brj9c" + "iminamifuranostrowiecastresistancexn--sandnessjen-ogbatsfjordnip" + "ropetrovskarpaczeladz-1xn--sandy-yuaxn--seral-lraxn--sgne-grazxn" + "--skierv-utazaskvollxn--skjervy-v1axn--skjk-soaxn--sknit-yqaxn--" + "sknland-fxaxn--slat-5naroyxn--slt-elabourxn--smla-hraxn--smna-gr" + "axn--snase-nraxn--sndre-land-0cbgxn--snes-poaxn--snsa-roaxn--sr-" + "aurdal-l8axn--sr-fron-q1axn--sr-odal-q1axn--sr-varanger-ggbeppub" + "olognagasukesennumamurogawallonieruchomoscienceandindustrynation" + "alheritagepilepsyzranzanativeamericanantiques3-sa-east-1xn--srfo" + "ld-byaxn--srreisa-q1axn--srum-graxn--stfold-9xaxn--stjrdal-s1axn" + "--stjrdalshalsen-sqberlincolnaturalhistorymuseumcenterxn--stre-t" + "oten-zcbernrtamayukiitatebayashichinohekinannestadpaleoceanograp" + "hics3-us-gov-west-1xn--tjme-hraxn--tn0agrigentomologyeonggiehtav" + "uoatnagahamaroyerotikadenagaivuotnagakutechnologyeongnamegawakka" + "naibetsubamericanartanddesignieznodawaraholtalendoftheinternetcm" + "wxn--tnsberg-q1axn--trany-yuaxn--trgstad-r1axn--trna-woaxn--trom" + "s-zuaxn--tysvr-vraxn--uc0atvedestrandxn--uc0ay4axn--unjrga-rtaki" + "zawaxn--unup4yxn--vads-jraxn--vard-jraxn--vegrshei-c0axn--vestvg" + "y-ixa6oxn--vg-yiabeskidyn-o-saurlandebuildingjesdalipetskaruizaw" + "axn--vgan-qoaxn--vgsy-qoa0jewishartransportrapaniizaxn--vhquvest" + "re-slidreamhostersevastopolelxn--vler-qoaxn--vre-eiker-k8axn--vr" + "ggt-xqadxn--vry-yla5gxn--wcvs22dxn--wgbh1circuscultureggioemilia" + "xn--wgbl6axn--xkc2al3hye2axn--xkc2dl3a5ee0hakonexn--yer-znarusaw" + "axn--yfro4i67oxn--ygarden-p1axn--ygbi2ammxn--80asehdbambleangavi" + "ikagoshimalselvendrellindesnes3-eu-west-1xn--ystre-slidre-ujbeta" + "inaboxfordeatnuorockartuzyonabarullensvangjovikarumaintenancevje" + "-og-hornnessetagayaseljordrangedalivornoceanographiquebecasadela" + "monedaxn--zf0ao64axn--zf0avxn--80aswgxxxn--90a3academykolaivano-" + "frankivskiervaapsteiermarkonyvelomzaporizhzhiaxz" // 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 // the children array), ICANN bit and text. // // In the //-comment after each node's data, the nodes indexes of the children // are formatted as (n0x1234-n0x1256), with * denoting the wildcard bit. The // nodeType is printed as + for normal, ! for exception, and o for parent-only // nodes that have children but don't match a domain label in their own right. // An I denotes an ICANN domain. // // The layout within the uint32, from MSB to LSB, is: // [ 1 bits] unused // [ 9 bits] children index // [ 1 bits] ICANN bit // [15 bits] text index // [ 6 bits] text length var nodes = [...]uint32{ 0x01a028c2, // n0x0000 c0x0006 (n0x0171-n0x0177) + I ac 0x01e02742, // n0x0001 c0x0007 (n0x0177-n0x0178) + I ad 0x02213e42, // n0x0002 c0x0008 (n0x0178-n0x017f) + I ae 0x026251c4, // n0x0003 c0x0009 (n0x017f-n0x01d8) + I aero 0x02a07402, // n0x0004 c0x000a (n0x01d8-n0x01dd) + I af 0x02e04882, // n0x0005 c0x000b (n0x01dd-n0x01e2) + I ag 0x03200582, // n0x0006 c0x000c (n0x01e2-n0x01e6) + I ai 0x03601dc2, // n0x0007 c0x000d (n0x01e6-n0x01ec) + I al 0x00200dc2, // n0x0008 c0x0000 (---------------) + I am 0x03a00a82, // n0x0009 c0x000e (n0x01ec-n0x01f0) + I an 0x03e00d02, // n0x000a c0x000f (n0x01f0-n0x01f6) + I ao 0x00269742, // n0x000b c0x0000 (---------------) + I aq 0x04203902, // n0x000c c0x0010 (n0x01f6-n0x01fe) + I ar 0x04b39284, // n0x000d c0x0012 (n0x01ff-n0x0205) o I arpa 0x04e00182, // n0x000e c0x0013 (n0x0205-n0x0206) + I as 0x00237a04, // n0x000f c0x0000 (---------------) + I asia 0x05200982, // n0x0010 c0x0014 (n0x0206-n0x020d) + I at 0x05a08742, // n0x0011 c0x0016 (n0x020e-n0x0221) o I au 0x06a00102, // n0x0012 c0x001a (n0x0231-n0x0232) + I aw 0x0023bf42, // n0x0013 c0x0000 (---------------) + I ax 0x06e0b342, // n0x0014 c0x001b (n0x0232-n0x023e) + I az 0x07201242, // n0x0015 c0x001c (n0x023e-n0x0248) + I ba 0x07639782, // n0x0016 c0x001d (n0x0248-n0x0250) + I bb 0x016ee802, // n0x0017 c0x0005 (---------------)* o I bd 0x07a03042, // n0x0018 c0x001e (n0x0250-n0x0252) + I be 0x07f21802, // n0x0019 c0x001f (n0x0252-n0x0253) + I bf 0x0833c7c2, // n0x001a c0x0020 (n0x0253-n0x0277) + I bg 0x08617382, // n0x001b c0x0021 (n0x0277-n0x027c) + I bh 0x08a00002, // n0x001c c0x0022 (n0x027c-n0x0281) + I bi 0x002054c4, // n0x001d c0x0000 (---------------) + I bike 0x08eb5183, // n0x001e c0x0023 (n0x0281-n0x0288) + I biz 0x0920eb42, // n0x001f c0x0024 (n0x0288-n0x028c) + I bj 0x09610682, // n0x0020 c0x0025 (n0x028c-n0x0291) + I bm 0x016a96c2, // n0x0021 c0x0005 (---------------)* o I bn 0x09a07c82, // n0x0022 c0x0026 (n0x0291-n0x029a) + I bo 0x09e03e42, // n0x0023 c0x0027 (n0x029a-n0x02df) + I br 0x0a6092c2, // n0x0024 c0x0029 (n0x02e0-n0x02e5) + I bs 0x0aa39ac2, // n0x0025 c0x002a (n0x02e5-n0x02ea) + I bt 0x00223944, // n0x0026 c0x0000 (---------------) + I buzz 0x0ae25582, // n0x0027 c0x002b (n0x02ea-n0x02ec) + I bw 0x0b214082, // n0x0028 c0x002c (n0x02ec-n0x02f0) + I by 0x0b625d42, // n0x0029 c0x002d (n0x02f0-n0x02f5) + I bz 0x0ba00402, // n0x002a c0x002e (n0x02f5-n0x0306) + I ca 0x0026eac6, // n0x002b c0x0000 (---------------) + I camera 0x002e0286, // n0x002c c0x0000 (---------------) + I career 0x002e0287, // n0x002d c0x0000 (---------------) + I careers 0x00201b43, // n0x002e c0x0000 (---------------) + I cat 0x0be01942, // n0x002f c0x002f (n0x0306-n0x030a) + I cc 0x0c2f6602, // n0x0030 c0x0030 (n0x030a-n0x030b) + I cd 0x0c6bf202, // n0x0031 c0x0031 (n0x030b-n0x030c) + I cf 0x002154c2, // n0x0032 c0x0000 (---------------) + I cg 0x0ca00a02, // n0x0033 c0x0032 (n0x030c-n0x030d) + I ch 0x0ce01e82, // n0x0034 c0x0033 (n0x030d-n0x031c) + I ci 0x0d200c02, // n0x0035 c0x0034 (n0x031c-n0x031d)* o I ck 0x0d600b42, // n0x0036 c0x0035 (n0x031d-n0x0321) + I cl 0x00229988, // n0x0037 c0x0000 (---------------) + I clothing 0x0db45f82, // n0x0038 c0x0036 (n0x0321-n0x0322) + I cm 0x0de2dc82, // n0x0039 c0x0037 (n0x0322-n0x034e) + I cn 0x0e208f82, // n0x003a c0x0038 (n0x034e-n0x035b) + I co 0x0e6104c3, // n0x003b c0x0039 (n0x035b-n0x0414) + I com 0x002322cc, // n0x003c c0x0000 (---------------) + I construction 0x0023518b, // n0x003d c0x0000 (---------------) + I contractors 0x00236044, // n0x003e c0x0000 (---------------) + I coop 0x0f639282, // n0x003f c0x003d (n0x0435-n0x043c) + I cr 0x0fa06482, // n0x0040 c0x003e (n0x043c-n0x0442) + I cu 0x0ff17902, // n0x0041 c0x003f (n0x0442-n0x0443) + I cv 0x1032d3c2, // n0x0042 c0x0040 (n0x0443-n0x0447) + I cw 0x1063cb02, // n0x0043 c0x0041 (n0x0447-n0x0449) + I cx 0x0163d302, // n0x0044 c0x0005 (---------------)* o I cy 0x10a026c2, // n0x0045 c0x0042 (n0x0449-n0x044a) + I cz 0x10e09102, // n0x0046 c0x0043 (n0x044a-n0x0452) + I de 0x002e7908, // n0x0047 c0x0000 (---------------) + I diamonds 0x002a82c9, // n0x0048 c0x0000 (---------------) + I directory 0x00203782, // n0x0049 c0x0000 (---------------) + I dj 0x11295182, // n0x004a c0x0044 (n0x0452-n0x0453) + I dk 0x11644cc2, // n0x004b c0x0045 (n0x0453-n0x0458) + I dm 0x11a1a1c2, // n0x004c c0x0046 (n0x0458-n0x0462) + I do 0x11e60242, // n0x004d c0x0047 (n0x0462-n0x046a) + I dz 0x12201902, // n0x004e c0x0048 (n0x046a-n0x0476) + I ec 0x002ceec3, // n0x004f c0x0000 (---------------) + I edu 0x1260b9c2, // n0x0050 c0x0049 (n0x0476-n0x0480) + I ee 0x12a1a842, // n0x0051 c0x004a (n0x0480-n0x0489) + I eg 0x002ec70b, // n0x0052 c0x0000 (---------------) + I enterprises 0x00337989, // n0x0053 c0x0000 (---------------) + I equipment 0x016004c2, // n0x0054 c0x0005 (---------------)* o I er 0x12e016c2, // n0x0055 c0x004b (n0x0489-n0x048e) + I es 0x0026efc6, // n0x0056 c0x0000 (---------------) + I estate 0x016013c2, // n0x0057 c0x0005 (---------------)* o I et 0x0020f502, // n0x0058 c0x0000 (---------------) + I eu 0x13601ac2, // n0x0059 c0x004d (n0x048f-n0x0492) + I fi 0x01607442, // n0x005a c0x0005 (---------------)* o I fj 0x0168fd02, // n0x005b c0x0005 (---------------)* o I fk 0x00332782, // n0x005c c0x0000 (---------------) + I fm 0x00218142, // n0x005d c0x0000 (---------------) + I fo 0x13a108c2, // n0x005e c0x004e (n0x0492-n0x04aa) + I fr 0x0026bf86, // n0x005f c0x0000 (---------------) + I futbol 0x002008c2, // n0x0060 c0x0000 (---------------) + I ga 0x00234c47, // n0x0061 c0x0000 (---------------) + I gallery 0x0020bf02, // n0x0062 c0x0000 (---------------) + I gd 0x13e01302, // n0x0063 c0x004f (n0x04aa-n0x04b1) + I ge 0x00223dc2, // n0x0064 c0x0000 (---------------) + I gf 0x14207942, // n0x0065 c0x0050 (n0x04b1-n0x04b6) + I gg 0x1462e502, // n0x0066 c0x0051 (n0x04b6-n0x04bb) + I gh 0x14a17c02, // n0x0067 c0x0052 (n0x04bb-n0x04c1) + I gi 0x002088c2, // n0x0068 c0x0000 (---------------) + I gl 0x00229b42, // n0x0069 c0x0000 (---------------) + I gm 0x14e0fb82, // n0x006a c0x0053 (n0x04c1-n0x04c7) o I gn 0x002150c3, // n0x006b c0x0000 (---------------) + I gov 0x152bce02, // n0x006c c0x0054 (n0x04c7-n0x04cd) + I gp 0x0022d302, // n0x006d c0x0000 (---------------) + I gq 0x156063c2, // n0x006e c0x0055 (n0x04cd-n0x04d3) + I gr 0x00342f08, // n0x006f c0x0000 (---------------) + I graphics 0x00223142, // n0x0070 c0x0000 (---------------) + I gs 0x15a002c2, // n0x0071 c0x0056 (n0x04d3-n0x04da) + I gt 0x01607f02, // n0x0072 c0x0005 (---------------)* o I gu 0x002c3f05, // n0x0073 c0x0000 (---------------) + I guide 0x002673c4, // n0x0074 c0x0000 (---------------) + I guru 0x00229f02, // n0x0075 c0x0000 (---------------) + I gw 0x15e03f82, // n0x0076 c0x0057 (n0x04da-n0x04dd) + I gy 0x1622e542, // n0x0077 c0x0058 (n0x04dd-n0x04f3) + I hk 0x00271702, // n0x0078 c0x0000 (---------------) + I hm 0x16664042, // n0x0079 c0x0059 (n0x04f3-n0x04f9) + I hn 0x002886c8, // n0x007a c0x0000 (---------------) + I holdings 0x16a1a6c2, // n0x007b c0x005a (n0x04f9-n0x04fd) + I hr 0x16e0a5c2, // n0x007c c0x005b (n0x04fd-n0x050e) + I ht 0x1723d6c2, // n0x007d c0x005c (n0x050e-n0x052e) + I hu 0x1760ab82, // n0x007e c0x005d (n0x052e-n0x0538) + I id 0x17a00042, // n0x007f c0x005e (n0x0538-n0x053a) + I ie 0x17e05682, // n0x0080 c0x005f (n0x053a-n0x053b)* o I il 0x1860e682, // n0x0081 c0x0061 (n0x053c-n0x0542) + I im 0x18e00242, // n0x0082 c0x0063 (n0x0544-n0x0551) + I in 0x192180c4, // n0x0083 c0x0064 (n0x0551-n0x055b) + I info 0x1961fe43, // n0x0084 c0x0065 (n0x055b-n0x055c) + I int 0x19a01c02, // n0x0085 c0x0066 (n0x055c-n0x055e) + I io 0x19e2f482, // n0x0086 c0x0067 (n0x055e-n0x0564) + I iq 0x1a204fc2, // n0x0087 c0x0068 (n0x0564-n0x056d) + I ir 0x1a6005c2, // n0x0088 c0x0069 (n0x056d-n0x0573) + I is 0x1aa034c2, // n0x0089 c0x006a (n0x0573-n0x0689) + I it 0x1ae0f782, // n0x008a c0x006b (n0x0689-n0x068e) + I je 0x01743602, // n0x008b c0x0005 (---------------)* o I jm 0x1b207182, // n0x008c c0x006c (n0x068e-n0x0696) + I jo 0x00285dc4, // n0x008d c0x0000 (---------------) + I jobs 0x1b690082, // n0x008e c0x006d (n0x0696-n0x06d6) + I jp 0x01601682, // n0x008f c0x0005 (---------------)* o I ke 0x29243242, // n0x0090 c0x00a4 (n0x0d6c-n0x0d72) + I kg 0x01644dc2, // n0x0091 c0x0005 (---------------)* o I kh 0x296007c2, // n0x0092 c0x00a5 (n0x0d72-n0x0d79) + I ki 0x00235c03, // n0x0093 c0x0000 (---------------) + I kim 0x002e3f87, // n0x0094 c0x0000 (---------------) + I kitchen 0x002c9c44, // n0x0095 c0x0000 (---------------) + I kiwi 0x29b1e782, // n0x0096 c0x00a6 (n0x0d79-n0x0d8a) + I km 0x29e3ec82, // n0x0097 c0x00a7 (n0x0d8a-n0x0d8e) + I kn 0x2a226ac2, // n0x0098 c0x00a8 (n0x0d8e-n0x0d94) o I kp 0x2a603b82, // n0x0099 c0x00a9 (n0x0d94-n0x0db2) + I kr 0x016a5c42, // n0x009a c0x0005 (---------------)* o I kw 0x2aa1ed02, // n0x009b c0x00aa (n0x0db2-n0x0db7) + I ky 0x2aebea42, // n0x009c c0x00ab (n0x0db7-n0x0dbd) + I kz 0x2b2000c2, // n0x009d c0x00ac (n0x0dbd-n0x0dc6) + I la 0x00203984, // n0x009e c0x0000 (---------------) + I land 0x2b6056c2, // n0x009f c0x00ad (n0x0dc6-n0x0dcb) o I lb 0x2ba13702, // n0x00a0 c0x00ae (n0x0dcb-n0x0dd1) + I lc 0x00208d42, // n0x00a1 c0x0000 (---------------) + I li 0x00241cc8, // n0x00a2 c0x0000 (---------------) + I lighting 0x2be1d042, // n0x00a3 c0x00af (n0x0dd1-n0x0ddf) + I lk 0x2c26c8c2, // n0x00a4 c0x00b0 (n0x0ddf-n0x0de4) o I lr 0x2c601e02, // n0x00a5 c0x00b1 (n0x0de4-n0x0de6) + I ls 0x2ca06502, // n0x00a6 c0x00b2 (n0x0de6-n0x0de7) + I lt 0x00209882, // n0x00a7 c0x0000 (---------------) + I lu 0x2ce03242, // n0x00a8 c0x00b3 (n0x0de7-n0x0df0) + I lv 0x2d25d282, // n0x00a9 c0x00b4 (n0x0df0-n0x0df9) + I ly 0x2d600742, // n0x00aa c0x00b5 (n0x0df9-n0x0dff) + I ma 0x2dac95c2, // n0x00ab c0x00b6 (n0x0dff-n0x0e01) + I mc 0x002106c2, // n0x00ac c0x0000 (---------------) + I md 0x2de08202, // n0x00ad c0x00b7 (n0x0e01-n0x0e09) + I me 0x00299044, // n0x00ae c0x0000 (---------------) + I menu 0x2e321182, // n0x00af c0x00b8 (n0x0e09-n0x0e11) + I mg 0x00310882, // n0x00b0 c0x0000 (---------------) + I mh 0x0025f683, // n0x00b1 c0x0000 (---------------) + I mil 0x2e726902, // n0x00b2 c0x00b9 (n0x0e11-n0x0e18) + I mk 0x2ea11a82, // n0x00b3 c0x00ba (n0x0e18-n0x0e1f) + I ml 0x01614a82, // n0x00b4 c0x0005 (---------------)* o I mm 0x2ee03cc2, // n0x00b5 c0x00bb (n0x0e1f-n0x0e23) + I mn 0x2f20a782, // n0x00b6 c0x00bc (n0x0e23-n0x0e28) + I mo 0x0020adc4, // n0x00b7 c0x0000 (---------------) + I mobi 0x0023ae86, // n0x00b8 c0x0000 (---------------) + I monash 0x00202e42, // n0x00b9 c0x0000 (---------------) + I mp 0x00307d02, // n0x00ba c0x0000 (---------------) + I mq 0x2f63d382, // n0x00bb c0x00bd (n0x0e28-n0x0e2a) + I mr 0x00222fc2, // n0x00bc c0x0000 (---------------) + I ms 0x01652e82, // n0x00bd c0x0005 (---------------)* o I mt 0x2fa04a82, // n0x00be c0x00be (n0x0e2a-n0x0e31) + I mu 0x2feb9786, // n0x00bf c0x00bf (n0x0e31-n0x1055) + I museum 0x3021adc2, // n0x00c0 c0x00c0 (n0x1055-n0x1063) + I mv 0x30745fc2, // n0x00c1 c0x00c1 (n0x1063-n0x106e) + I mw 0x30b2a542, // n0x00c2 c0x00c2 (n0x106e-n0x1074) + I mx 0x30e246c2, // n0x00c3 c0x00c3 (n0x1074-n0x107b) + I my 0x31353842, // n0x00c4 c0x00c4 (n0x107b-n0x107c)* o I mz 0x31601c82, // n0x00c5 c0x00c5 (n0x107c-n0x108d) + I na 0x31ad16c4, // n0x00c6 c0x00c6 (n0x108d-n0x108f) + I name 0x32601f42, // n0x00c7 c0x00c9 (n0x1091-n0x1092) + I nc 0x00205f42, // n0x00c8 c0x0000 (---------------) + I ne 0x32a39bc3, // n0x00c9 c0x00ca (n0x1092-n0x10bd) + I net 0x33a18102, // n0x00ca c0x00ce (n0x10c4-n0x10ce) + I nf 0x33e00282, // n0x00cb c0x00cf (n0x10ce-n0x10d7) + I ng 0x01601002, // n0x00cc c0x0005 (---------------)* o I ni 0x34231642, // n0x00cd c0x00d0 (n0x10d7-n0x10da) + I nl 0x346006c2, // n0x00ce c0x00d1 (n0x10da-n0x13b0) + I no 0x01614642, // n0x00cf c0x0005 (---------------)* o I np 0x3ca10ac2, // n0x00d0 c0x00f2 (n0x13d8-n0x13df) + I nr 0x3ce52942, // n0x00d1 c0x00f3 (n0x13df-n0x13e2) + I nu 0x3d227942, // n0x00d2 c0x00f4 (n0x13e2-n0x13e3)* o I nz 0x3da00702, // n0x00d3 c0x00f6 (n0x13e4-n0x13f7) + I om 0x00231603, // n0x00d4 c0x0000 (---------------) + I onl 0x3de453c3, // n0x00d5 c0x00f7 (n0x13f7-n0x142c) + I org 0x0027a286, // n0x00d6 c0x0000 (---------------) + I otsuka 0x3e611382, // n0x00d7 c0x00f9 (n0x142e-n0x1439) + I pa 0x3ea08682, // n0x00d8 c0x00fa (n0x1439-n0x1440) + I pe 0x3ef2e842, // n0x00d9 c0x00fb (n0x1440-n0x1443) + I pf 0x0171ce02, // n0x00da c0x0005 (---------------)* o I pg 0x3f298042, // n0x00db c0x00fc (n0x1443-n0x144b) + I ph 0x002bce4b, // n0x00dc c0x0000 (---------------) + I photography 0x002be984, // n0x00dd c0x0000 (---------------) + I pink 0x3f6c05c2, // n0x00de c0x00fd (n0x144b-n0x1459) + I pk 0x3fa0dcc2, // n0x00df c0x00fe (n0x1459-n0x1504) + I pl 0x002c2508, // n0x00e0 c0x0000 (---------------) + I plumbing 0x002714c2, // n0x00e1 c0x0000 (---------------) + I pm 0x402900c2, // n0x00e2 c0x0100 (n0x150d-n0x1512) + I pn 0x00214684, // n0x00e3 c0x0000 (---------------) + I post 0x4060e2c2, // n0x00e4 c0x0101 (n0x1512-n0x151f) + I pr 0x40ac5983, // n0x00e5 c0x0102 (n0x151f-n0x1526) + I pro 0x40e21942, // n0x00e6 c0x0103 (n0x1526-n0x152d) + I ps 0x412c6682, // n0x00e7 c0x0104 (n0x152d-n0x1536) + I pt 0x416c79c2, // n0x00e8 c0x0105 (n0x1536-n0x153c) + I pw 0x41ab9182, // n0x00e9 c0x0106 (n0x153c-n0x1543) + I py 0x41ef04c2, // n0x00ea c0x0107 (n0x1543-n0x154b) + I qa 0x42202142, // n0x00eb c0x0108 (n0x154b-n0x154f) + I re 0x00268ec7, // n0x00ec c0x0000 (---------------) + I reviews 0x42603a82, // n0x00ed c0x0109 (n0x154f-n0x155b) + I ro 0x42a08082, // n0x00ee c0x010a (n0x155b-n0x1561) + I rs 0x42e03e82, // n0x00ef c0x010b (n0x1561-n0x15e6) + I ru 0x002a0744, // n0x00f0 c0x0000 (---------------) + I ruhr 0x432083c2, // n0x00f1 c0x010c (n0x15e6-n0x15ef) + I rw 0x43600cc2, // n0x00f2 c0x010d (n0x15ef-n0x15f7) + I sa 0x43a31c42, // n0x00f3 c0x010e (n0x15f7-n0x15fc) + I sb 0x43e01e42, // n0x00f4 c0x010f (n0x15fc-n0x1601) + I sc 0x4424db82, // n0x00f5 c0x0110 (n0x1601-n0x1609) + I sd 0x44600482, // n0x00f6 c0x0111 (n0x1609-n0x1632) + I se 0x0020e3c4, // n0x00f7 c0x0000 (---------------) + I sexy 0x44a03f42, // n0x00f8 c0x0112 (n0x1632-n0x1639) + I sg 0x44e001c2, // n0x00f9 c0x0113 (n0x1639-n0x163e) + I sh 0x00229205, // n0x00fa c0x0000 (---------------) + I shoes 0x00205a42, // n0x00fb c0x0000 (---------------) + I si 0x0021e307, // n0x00fc c0x0000 (---------------) + I singles 0x452033c2, // n0x00fd c0x0114 (n0x163e-n0x163f) + I sk 0x4561ef02, // n0x00fe c0x0115 (n0x163f-n0x1644) + I sl 0x00215b42, // n0x00ff c0x0000 (---------------) + I sm 0x45a02002, // n0x0100 c0x0116 (n0x1644-n0x164b) + I sn 0x45e02fc2, // n0x0101 c0x0117 (n0x164b-n0x164e) + I so 0x002b1502, // n0x0102 c0x0000 (---------------) + I sr 0x46202482, // n0x0103 c0x0118 (n0x164e-n0x165a) + I st 0x00203102, // n0x0104 c0x0000 (---------------) + I su 0x46601702, // n0x0105 c0x0119 (n0x165a-n0x165f) + I sv 0x46ae1042, // n0x0106 c0x011a (n0x165f-n0x1660) + I sx 0x46e63e42, // n0x0107 c0x011b (n0x1660-n0x1666) + I sy 0x47202642, // n0x0108 c0x011c (n0x1666-n0x1669) + I sz 0x00238006, // n0x0109 c0x0000 (---------------) + I tattoo 0x002009c2, // n0x010a c0x0000 (---------------) + I tc 0x47609bc2, // n0x010b c0x011d (n0x1669-n0x166a) + I td 0x003449ca, // n0x010c c0x0000 (---------------) + I technology 0x002103c3, // n0x010d c0x0000 (---------------) + I tel 0x002257c2, // n0x010e c0x0000 (---------------) + I tf 0x00234c02, // n0x010f c0x0000 (---------------) + I tg 0x47a095c2, // n0x0110 c0x011e (n0x166a-n0x1671) + I th 0x002218c4, // n0x0111 c0x0000 (---------------) + I tips 0x47e3fb82, // n0x0112 c0x011f (n0x1671-n0x1680) + I tj 0x00294842, // n0x0113 c0x0000 (---------------) + I tk 0x48209002, // n0x0114 c0x0120 (n0x1680-n0x1681) + I tl 0x4863d502, // n0x0115 c0x0121 (n0x1681-n0x1689) + I tm 0x48a0ff42, // n0x0116 c0x0122 (n0x1689-n0x169d) + I tn 0x48e00302, // n0x0117 c0x0123 (n0x169d-n0x16a3) + I to 0x0020d705, // n0x0118 c0x0000 (---------------) + I today 0x49209942, // n0x0119 c0x0124 (n0x16a3-n0x16a5)* o I tr 0x0029ed06, // n0x011a c0x0000 (---------------) + I travel 0x49a03502, // n0x011b c0x0126 (n0x16a6-n0x16b7) + I tt 0x49e7ecc2, // n0x011c c0x0127 (n0x16b7-n0x16bb) + I tv 0x4a247802, // n0x011d c0x0128 (n0x16bb-n0x16c9) + I tw 0x4a639c42, // n0x011e c0x0129 (n0x16c9-n0x16d5) o I tz 0x4aa697c2, // n0x011f c0x012a (n0x16d5-n0x1723) + I ua 0x4ae00882, // n0x0120 c0x012b (n0x1723-n0x172b) + I ug 0x4b203ec2, // n0x0121 c0x012c (n0x172b-n0x1736)* o I uk 0x0021a4c3, // n0x0122 c0x0000 (---------------) + I uno 0x4ba02342, // n0x0123 c0x012e (n0x1737-n0x1776) + I us 0x59e1d142, // n0x0124 c0x0167 (n0x181d-n0x1823) + I uy 0x5a204d42, // n0x0125 c0x0168 (n0x1823-n0x1827) + I uz 0x00202b82, // n0x0126 c0x0000 (---------------) + I va 0x5a633d02, // n0x0127 c0x0169 (n0x1827-n0x182d) + I vc 0x5aa05902, // n0x0128 c0x016a (n0x182d-n0x1837) + I ve 0x002355c8, // n0x0129 c0x0000 (---------------) + I ventures 0x002579c2, // n0x012a c0x0000 (---------------) + I vg 0x5ae0afc2, // n0x012b c0x016b (n0x1837-n0x183c) + I vi 0x5b213cc2, // n0x012c c0x016c (n0x183c-n0x1848) + I vn 0x002f9006, // n0x012d c0x0000 (---------------) + I voyage 0x00201742, // n0x012e c0x0000 (---------------) + I vu 0x00289f83, // n0x012f c0x0000 (---------------) + I wed 0x0022d5c2, // n0x0130 c0x0000 (---------------) + I wf 0x5b61c282, // n0x0131 c0x016d (n0x1848-n0x184f) + I ws 0x0023cb4b, // n0x0132 c0x0000 (---------------) + I xn--3bst00m 0x0025b64b, // n0x0133 c0x0000 (---------------) + I xn--3ds443g 0x0026928c, // n0x0134 c0x0000 (---------------) + I xn--3e0b707e 0x0027f64b, // n0x0135 c0x0000 (---------------) + I xn--45brj9c 0x0028930a, // n0x0136 c0x0000 (---------------) + I xn--4gbrim 0x0028988e, // n0x0137 c0x0000 (---------------) + I xn--54b7fta0cc 0x002bcb8b, // n0x0138 c0x0000 (---------------) + I xn--6frz82g 0x002e108e, // n0x0139 c0x0000 (---------------) + I xn--6qq986b3xl 0x0034ea4c, // n0x013a c0x0000 (---------------) + I xn--80asehdb 0x003526ca, // n0x013b c0x0000 (---------------) + I xn--80aswg 0x003529ca, // n0x013c c0x0000 (---------------) + I xn--90a3ac 0x002f58ca, // n0x013d c0x0000 (---------------) + I xn--cg4bki 0x002f6116, // n0x013e c0x0000 (---------------) + I xn--clchc0ea0b2g2a9gcd 0x002ff60e, // n0x013f c0x0000 (---------------) + I xn--fiq228c5hs 0x002ffeca, // n0x0140 c0x0000 (---------------) + I xn--fiq64b 0x0030110a, // n0x0141 c0x0000 (---------------) + I xn--fiqs8s 0x003016ca, // n0x0142 c0x0000 (---------------) + I xn--fiqz9s 0x0030280d, // n0x0143 c0x0000 (---------------) + I xn--fpcrj9c3d 0x00303f4d, // n0x0144 c0x0000 (---------------) + I xn--fzc2c9e2c 0x00304a8b, // n0x0145 c0x0000 (---------------) + I xn--gecrj9c 0x00309f8b, // n0x0146 c0x0000 (---------------) + I xn--h2brj9c 0x003106c9, // n0x0147 c0x0000 (---------------) + I xn--j1amh 0x00310c0b, // n0x0148 c0x0000 (---------------) + I xn--j6w193g 0x00312c0b, // n0x0149 c0x0000 (---------------) + I xn--kprw13d 0x00312ecb, // n0x014a c0x0000 (---------------) + I xn--kpry57d 0x0031ad8f, // n0x014b c0x0000 (---------------) + I xn--lgbbat1ad8j 0x0032108c, // n0x014c c0x0000 (---------------) + I xn--mgb2ddes 0x0032158c, // n0x014d c0x0000 (---------------) + I xn--mgb9awbf 0x00321a0f, // n0x014e c0x0000 (---------------) + I xn--mgba3a4f16a 0x00321dce, // n0x014f c0x0000 (---------------) + I xn--mgba3a4fra 0x003225ce, // n0x0150 c0x0000 (---------------) + I xn--mgbaam7a8h 0x00322b8e, // n0x0151 c0x0000 (---------------) + I xn--mgbayh7gpa 0x00322fce, // n0x0152 c0x0000 (---------------) + I xn--mgbbh1a71e 0x0032334f, // n0x0153 c0x0000 (---------------) + I xn--mgbc0a9azcg 0x00323713, // n0x0154 c0x0000 (---------------) + I xn--mgberp4a5d4a87g 0x00323bd1, // n0x0155 c0x0000 (---------------) + I xn--mgberp4a5d4ar 0x00324013, // n0x0156 c0x0000 (---------------) + I xn--mgbqly7c0a67fbc 0x00325090, // n0x0157 c0x0000 (---------------) + I xn--mgbqly7cvafr 0x003258cc, // n0x0158 c0x0000 (---------------) + I xn--mgbtf8fl 0x0032aa4c, // n0x0159 c0x0000 (---------------) + I xn--ngbc5azd 0x0032b60b, // n0x015a c0x0000 (---------------) + I xn--nnx388a 0x0032b8c8, // n0x015b c0x0000 (---------------) + I xn--node 0x0032d24a, // n0x015c c0x0000 (---------------) + I xn--o3cw4h 0x0032e68c, // n0x015d c0x0000 (---------------) + I xn--ogbpf8fl 0x0032f7c8, // n0x015e c0x0000 (---------------) + I xn--p1ai 0x0032ffcb, // n0x015f c0x0000 (---------------) + I xn--pgbs0dh 0x0033154b, // n0x0160 c0x0000 (---------------) + I xn--q9jyb4c 0x00333f4b, // n0x0161 c0x0000 (---------------) + I xn--rhqv96g 0x00337d4b, // n0x0162 c0x0000 (---------------) + I xn--s9brj9c 0x0034810a, // n0x0163 c0x0000 (---------------) + I xn--unup4y 0x0034ad09, // n0x0164 c0x0000 (---------------) + I xn--vhquv 0x0034c80a, // n0x0165 c0x0000 (---------------) + I xn--wgbh1c 0x0034d00a, // n0x0166 c0x0000 (---------------) + I xn--wgbl6a 0x0034d290, // n0x0167 c0x0000 (---------------) + I xn--xkc2al3hye2a 0x0034d691, // n0x0168 c0x0000 (---------------) + I xn--xkc2dl3a5ee0h 0x0034e04d, // n0x0169 c0x0000 (---------------) + I xn--yfro4i67o 0x0034e74d, // n0x016a c0x0000 (---------------) + I xn--ygbi2ammx 0x00352943, // n0x016b c0x0000 (---------------) + I xxx 0x01619502, // n0x016c c0x0005 (---------------)* o I ye 0x00255382, // n0x016d c0x0000 (---------------) + I yt 0x01602702, // n0x016e c0x0005 (---------------)* o I za 0x016bed42, // n0x016f c0x0005 (---------------)* o I zm 0x016c7a82, // n0x0170 c0x0005 (---------------)* o I zw 0x002104c3, // n0x0171 c0x0000 (---------------) + I com 0x002ceec3, // n0x0172 c0x0000 (---------------) + I edu 0x002150c3, // n0x0173 c0x0000 (---------------) + I gov 0x0025f683, // n0x0174 c0x0000 (---------------) + I mil 0x00239bc3, // n0x0175 c0x0000 (---------------) + I net 0x002453c3, // n0x0176 c0x0000 (---------------) + I org 0x002006c3, // n0x0177 c0x0000 (---------------) + I nom 0x002028c2, // n0x0178 c0x0000 (---------------) + I ac 0x00208f82, // n0x0179 c0x0000 (---------------) + I co 0x002150c3, // n0x017a c0x0000 (---------------) + I gov 0x0025f683, // n0x017b c0x0000 (---------------) + I mil 0x00239bc3, // n0x017c c0x0000 (---------------) + I net 0x002453c3, // n0x017d c0x0000 (---------------) + I org 0x00204343, // n0x017e c0x0000 (---------------) + I sch 0x002f2996, // n0x017f c0x0000 (---------------) + I accident-investigation 0x002f40d3, // n0x0180 c0x0000 (---------------) + I accident-prevention 0x002251c9, // n0x0181 c0x0000 (---------------) + I aerobatic 0x00259bc8, // n0x0182 c0x0000 (---------------) + I aeroclub 0x00290f09, // n0x0183 c0x0000 (---------------) + I aerodrome 0x002366c6, // n0x0184 c0x0000 (---------------) + I agents 0x00259310, // n0x0185 c0x0000 (---------------) + I air-surveillance 0x002659d3, // n0x0186 c0x0000 (---------------) + I air-traffic-control 0x00261ac8, // n0x0187 c0x0000 (---------------) + I aircraft 0x002855c7, // n0x0188 c0x0000 (---------------) + I airline 0x0029fb87, // n0x0189 c0x0000 (---------------) + I airport 0x002a188a, // n0x018a c0x0000 (---------------) + I airtraffic 0x002066c9, // n0x018b c0x0000 (---------------) + I ambulance 0x002fcb89, // n0x018c c0x0000 (---------------) + I amusement 0x002bae4b, // n0x018d c0x0000 (---------------) + I association 0x002a6ec6, // n0x018e c0x0000 (---------------) + I author 0x00223b4a, // n0x018f c0x0000 (---------------) + I ballooning 0x0021f3c6, // n0x0190 c0x0000 (---------------) + I broker 0x002facc3, // n0x0191 c0x0000 (---------------) + I caa 0x002e2745, // n0x0192 c0x0000 (---------------) + I cargo 0x00233d48, // n0x0193 c0x0000 (---------------) + I catering 0x0020198d, // n0x0194 c0x0000 (---------------) + I certification 0x002b5e4c, // n0x0195 c0x0000 (---------------) + I championship 0x0024c787, // n0x0196 c0x0000 (---------------) + I charter 0x0022618d, // n0x0197 c0x0000 (---------------) + I civilaviation 0x00259cc4, // n0x0198 c0x0000 (---------------) + I club 0x0023204a, // n0x0199 c0x0000 (---------------) + I conference 0x0023344a, // n0x019a c0x0000 (---------------) + I consultant 0x0023390a, // n0x019b c0x0000 (---------------) + I consulting 0x0022af87, // n0x019c c0x0000 (---------------) + I control 0x002adb47, // n0x019d c0x0000 (---------------) + I council 0x0023b244, // n0x019e c0x0000 (---------------) + I crew 0x00252b46, // n0x019f c0x0000 (---------------) + I design 0x002a9144, // n0x01a0 c0x0000 (---------------) + I dgca 0x002ceec8, // n0x01a1 c0x0000 (---------------) + I educator 0x00319189, // n0x01a2 c0x0000 (---------------) + I emergency 0x00326206, // n0x01a3 c0x0000 (---------------) + I engine 0x00326208, // n0x01a4 c0x0000 (---------------) + I engineer 0x0023c58d, // n0x01a5 c0x0000 (---------------) + I entertainment 0x00337989, // n0x01a6 c0x0000 (---------------) + I equipment 0x0021c348, // n0x01a7 c0x0000 (---------------) + I exchange 0x0020e247, // n0x01a8 c0x0000 (---------------) + I express 0x002c9e4a, // n0x01a9 c0x0000 (---------------) + I federation 0x00241c86, // n0x01aa c0x0000 (---------------) + I flight 0x00249c87, // n0x01ab c0x0000 (---------------) + I freight 0x002fcec4, // n0x01ac c0x0000 (---------------) + I fuel 0x00243407, // n0x01ad c0x0000 (---------------) + I gliding 0x0027c3ca, // n0x01ae c0x0000 (---------------) + I government 0x00241e8e, // n0x01af c0x0000 (---------------) + I groundhandling 0x00207985, // n0x01b0 c0x0000 (---------------) + I group 0x002702cb, // n0x01b1 c0x0000 (---------------) + I hanggliding 0x0023bd09, // n0x01b2 c0x0000 (---------------) + I homebuilt 0x0021ddc9, // n0x01b3 c0x0000 (---------------) + I insurance 0x00215947, // n0x01b4 c0x0000 (---------------) + I journal 0x0024830a, // n0x01b5 c0x0000 (---------------) + I journalist 0x0021e247, // n0x01b6 c0x0000 (---------------) + I leasing 0x00242389, // n0x01b7 c0x0000 (---------------) + I logistics 0x00291788, // n0x01b8 c0x0000 (---------------) + I magazine 0x00350c8b, // n0x01b9 c0x0000 (---------------) + I maintenance 0x0021278b, // n0x01ba c0x0000 (---------------) + I marketplace 0x002e2905, // n0x01bb c0x0000 (---------------) + I media 0x0025178a, // n0x01bc c0x0000 (---------------) + I microlight 0x00270ac9, // n0x01bd c0x0000 (---------------) + I modelling 0x0020fbca, // n0x01be c0x0000 (---------------) + I navigation 0x0023d58b, // n0x01bf c0x0000 (---------------) + I parachuting 0x0024330b, // n0x01c0 c0x0000 (---------------) + I paragliding 0x002babd5, // n0x01c1 c0x0000 (---------------) + I passenger-association 0x002be505, // n0x01c2 c0x0000 (---------------) + I pilot 0x0020e2c5, // n0x01c3 c0x0000 (---------------) + I press 0x002c5c0a, // n0x01c4 c0x0000 (---------------) + I production 0x002f9cca, // n0x01c5 c0x0000 (---------------) + I recreation 0x0023ba87, // n0x01c6 c0x0000 (---------------) + I repbody 0x0020e303, // n0x01c7 c0x0000 (---------------) + I res 0x002c31c8, // n0x01c8 c0x0000 (---------------) + I research 0x002b7e8a, // n0x01c9 c0x0000 (---------------) + I rotorcraft 0x00319ec6, // n0x01ca c0x0000 (---------------) + I safety 0x00296509, // n0x01cb c0x0000 (---------------) + I scientist 0x002db088, // n0x01cc c0x0000 (---------------) + I services 0x002d3144, // n0x01cd c0x0000 (---------------) + I show 0x0027fd89, // n0x01ce c0x0000 (---------------) + I skydiving 0x0024df08, // n0x01cf c0x0000 (---------------) + I software 0x002ab207, // n0x01d0 c0x0000 (---------------) + I student 0x0023bf04, // n0x01d1 c0x0000 (---------------) + I taxi 0x0024cd06, // n0x01d2 c0x0000 (---------------) + I trader 0x00288087, // n0x01d3 c0x0000 (---------------) + I trading 0x00297a07, // n0x01d4 c0x0000 (---------------) + I trainer 0x00247fc5, // n0x01d5 c0x0000 (---------------) + I union 0x002077cc, // n0x01d6 c0x0000 (---------------) + I workinggroup 0x00227dc5, // n0x01d7 c0x0000 (---------------) + I works 0x002104c3, // n0x01d8 c0x0000 (---------------) + I com 0x002ceec3, // n0x01d9 c0x0000 (---------------) + I edu 0x002150c3, // n0x01da c0x0000 (---------------) + I gov 0x00239bc3, // n0x01db c0x0000 (---------------) + I net 0x002453c3, // n0x01dc c0x0000 (---------------) + I org 0x00208f82, // n0x01dd c0x0000 (---------------) + I co 0x002104c3, // n0x01de c0x0000 (---------------) + I com 0x00239bc3, // n0x01df c0x0000 (---------------) + I net 0x002006c3, // n0x01e0 c0x0000 (---------------) + I nom 0x002453c3, // n0x01e1 c0x0000 (---------------) + I org 0x002104c3, // n0x01e2 c0x0000 (---------------) + I com 0x00239bc3, // n0x01e3 c0x0000 (---------------) + I net 0x00216f83, // n0x01e4 c0x0000 (---------------) + I off 0x002453c3, // n0x01e5 c0x0000 (---------------) + I org 0x002104c3, // n0x01e6 c0x0000 (---------------) + I com 0x002ceec3, // n0x01e7 c0x0000 (---------------) + I edu 0x002150c3, // n0x01e8 c0x0000 (---------------) + I gov 0x0025f683, // n0x01e9 c0x0000 (---------------) + I mil 0x00239bc3, // n0x01ea c0x0000 (---------------) + I net 0x002453c3, // n0x01eb c0x0000 (---------------) + I org 0x002104c3, // n0x01ec c0x0000 (---------------) + I com 0x002ceec3, // n0x01ed c0x0000 (---------------) + I edu 0x00239bc3, // n0x01ee c0x0000 (---------------) + I net 0x002453c3, // n0x01ef c0x0000 (---------------) + I org 0x00208f82, // n0x01f0 c0x0000 (---------------) + I co 0x00203582, // n0x01f1 c0x0000 (---------------) + I ed 0x00233b42, // n0x01f2 c0x0000 (---------------) + I gv 0x002034c2, // n0x01f3 c0x0000 (---------------) + I it 0x00205242, // n0x01f4 c0x0000 (---------------) + I og 0x0023bb02, // n0x01f5 c0x0000 (---------------) + I pb 0x046104c3, // n0x01f6 c0x0011 (n0x01fe-n0x01ff) + I com 0x002ceec3, // n0x01f7 c0x0000 (---------------) + I edu 0x00230083, // n0x01f8 c0x0000 (---------------) + I gob 0x0021fe43, // n0x01f9 c0x0000 (---------------) + I int 0x0025f683, // n0x01fa c0x0000 (---------------) + I mil 0x00239bc3, // n0x01fb c0x0000 (---------------) + I net 0x002453c3, // n0x01fc c0x0000 (---------------) + I org 0x00201d03, // n0x01fd c0x0000 (---------------) + I tur 0x00031c88, // n0x01fe c0x0000 (---------------) + blogspot 0x002aa044, // n0x01ff c0x0000 (---------------) + I e164 0x00298e07, // n0x0200 c0x0000 (---------------) + I in-addr 0x0025f243, // n0x0201 c0x0000 (---------------) + I ip6 0x00267204, // n0x0202 c0x0000 (---------------) + I iris 0x0020b703, // n0x0203 c0x0000 (---------------) + I uri 0x002159c3, // n0x0204 c0x0000 (---------------) + I urn 0x002150c3, // n0x0205 c0x0000 (---------------) + I gov 0x002028c2, // n0x0206 c0x0000 (---------------) + I ac 0x000b5183, // n0x0207 c0x0000 (---------------) + biz 0x05608f82, // n0x0208 c0x0015 (n0x020d-n0x020e) + I co 0x00233b42, // n0x0209 c0x0000 (---------------) + I gv 0x000180c4, // n0x020a c0x0000 (---------------) + info 0x00204282, // n0x020b c0x0000 (---------------) + I or 0x000c5804, // n0x020c c0x0000 (---------------) + priv 0x00031c88, // n0x020d c0x0000 (---------------) + blogspot 0x002352c3, // n0x020e c0x0000 (---------------) + I act 0x00299d43, // n0x020f c0x0000 (---------------) + I asn 0x05e104c3, // n0x0210 c0x0017 (n0x0221-n0x0222) + I com 0x00232044, // n0x0211 c0x0000 (---------------) + I conf 0x0021b3c5, // n0x0212 c0x0000 (---------------) + I csiro 0x062ceec3, // n0x0213 c0x0018 (n0x0222-n0x022a) + I edu 0x066150c3, // n0x0214 c0x0019 (n0x022a-n0x0231) + I gov 0x0020ab82, // n0x0215 c0x0000 (---------------) + I id 0x002180c4, // n0x0216 c0x0000 (---------------) + I info 0x00239bc3, // n0x0217 c0x0000 (---------------) + I net 0x00289f03, // n0x0218 c0x0000 (---------------) + I nsw 0x00204e02, // n0x0219 c0x0000 (---------------) + I nt 0x002453c3, // n0x021a c0x0000 (---------------) + I org 0x00217cc2, // n0x021b c0x0000 (---------------) + I oz 0x0024b443, // n0x021c c0x0000 (---------------) + I qld 0x00200cc2, // n0x021d c0x0000 (---------------) + I sa 0x00212443, // n0x021e c0x0000 (---------------) + I tas 0x0022fb03, // n0x021f c0x0000 (---------------) + I vic 0x00200142, // n0x0220 c0x0000 (---------------) + I wa 0x00031c88, // n0x0221 c0x0000 (---------------) + blogspot 0x002352c3, // n0x0222 c0x0000 (---------------) + I act 0x00289f03, // n0x0223 c0x0000 (---------------) + I nsw 0x00204e02, // n0x0224 c0x0000 (---------------) + I nt 0x0024b443, // n0x0225 c0x0000 (---------------) + I qld 0x00200cc2, // n0x0226 c0x0000 (---------------) + I sa 0x00212443, // n0x0227 c0x0000 (---------------) + I tas 0x0022fb03, // n0x0228 c0x0000 (---------------) + I vic 0x00200142, // n0x0229 c0x0000 (---------------) + I wa 0x002352c3, // n0x022a c0x0000 (---------------) + I act 0x00204e02, // n0x022b c0x0000 (---------------) + I nt 0x0024b443, // n0x022c c0x0000 (---------------) + I qld 0x00200cc2, // n0x022d c0x0000 (---------------) + I sa 0x00212443, // n0x022e c0x0000 (---------------) + I tas 0x0022fb03, // n0x022f c0x0000 (---------------) + I vic 0x00200142, // n0x0230 c0x0000 (---------------) + I wa 0x002104c3, // n0x0231 c0x0000 (---------------) + I com 0x002b5183, // n0x0232 c0x0000 (---------------) + I biz 0x002104c3, // n0x0233 c0x0000 (---------------) + I com 0x002ceec3, // n0x0234 c0x0000 (---------------) + I edu 0x002150c3, // n0x0235 c0x0000 (---------------) + I gov 0x002180c4, // n0x0236 c0x0000 (---------------) + I info 0x0021fe43, // n0x0237 c0x0000 (---------------) + I int 0x0025f683, // n0x0238 c0x0000 (---------------) + I mil 0x002d16c4, // n0x0239 c0x0000 (---------------) + I name 0x00239bc3, // n0x023a c0x0000 (---------------) + I net 0x002453c3, // n0x023b c0x0000 (---------------) + I org 0x00208642, // n0x023c c0x0000 (---------------) + I pp 0x002c5983, // n0x023d c0x0000 (---------------) + I pro 0x00208f82, // n0x023e c0x0000 (---------------) + I co 0x002104c3, // n0x023f c0x0000 (---------------) + I com 0x002ceec3, // n0x0240 c0x0000 (---------------) + I edu 0x002150c3, // n0x0241 c0x0000 (---------------) + I gov 0x0025f683, // n0x0242 c0x0000 (---------------) + I mil 0x00239bc3, // n0x0243 c0x0000 (---------------) + I net 0x002453c3, // n0x0244 c0x0000 (---------------) + I org 0x00208082, // n0x0245 c0x0000 (---------------) + I rs 0x002f4804, // n0x0246 c0x0000 (---------------) + I unbi 0x00267484, // n0x0247 c0x0000 (---------------) + I unsa 0x002b5183, // n0x0248 c0x0000 (---------------) + I biz 0x002104c3, // n0x0249 c0x0000 (---------------) + I com 0x002ceec3, // n0x024a c0x0000 (---------------) + I edu 0x002150c3, // n0x024b c0x0000 (---------------) + I gov 0x002180c4, // n0x024c c0x0000 (---------------) + I info 0x00239bc3, // n0x024d c0x0000 (---------------) + I net 0x002453c3, // n0x024e c0x0000 (---------------) + I org 0x002dd805, // n0x024f c0x0000 (---------------) + I store 0x002028c2, // n0x0250 c0x0000 (---------------) + I ac 0x00031c88, // n0x0251 c0x0000 (---------------) + blogspot 0x002150c3, // n0x0252 c0x0000 (---------------) + I gov 0x0023cd41, // n0x0253 c0x0000 (---------------) + I 0 0x00202541, // n0x0254 c0x0000 (---------------) + I 1 0x00204701, // n0x0255 c0x0000 (---------------) + I 2 0x002022c1, // n0x0256 c0x0000 (---------------) + I 3 0x0025b801, // n0x0257 c0x0000 (---------------) + I 4 0x0027f781, // n0x0258 c0x0000 (---------------) + I 5 0x0025f2c1, // n0x0259 c0x0000 (---------------) + I 6 0x00269481, // n0x025a c0x0000 (---------------) + I 7 0x002bcd81, // n0x025b c0x0000 (---------------) + I 8 0x0027f881, // n0x025c c0x0000 (---------------) + I 9 0x00200101, // n0x025d c0x0000 (---------------) + I a 0x00200001, // n0x025e c0x0000 (---------------) + I b 0x00200401, // n0x025f c0x0000 (---------------) + I c 0x002003c1, // n0x0260 c0x0000 (---------------) + I d 0x00200081, // n0x0261 c0x0000 (---------------) + I e 0x00201ac1, // n0x0262 c0x0000 (---------------) + I f 0x002002c1, // n0x0263 c0x0000 (---------------) + I g 0x00200201, // n0x0264 c0x0000 (---------------) + I h 0x00200041, // n0x0265 c0x0000 (---------------) + I i 0x002037c1, // n0x0266 c0x0000 (---------------) + I j 0x002007c1, // n0x0267 c0x0000 (---------------) + I k 0x002000c1, // n0x0268 c0x0000 (---------------) + I l 0x00200741, // n0x0269 c0x0000 (---------------) + I m 0x00200281, // n0x026a c0x0000 (---------------) + I n 0x00200341, // n0x026b c0x0000 (---------------) + I o 0x00202e81, // n0x026c c0x0000 (---------------) + I p 0x0022d341, // n0x026d c0x0000 (---------------) + I q 0x00200501, // n0x026e c0x0000 (---------------) + I r 0x002001c1, // n0x026f c0x0000 (---------------) + I s 0x00200301, // n0x0270 c0x0000 (---------------) + I t 0x00200881, // n0x0271 c0x0000 (---------------) + I u 0x00201741, // n0x0272 c0x0000 (---------------) + I v 0x00200141, // n0x0273 c0x0000 (---------------) + I w 0x00201381, // n0x0274 c0x0000 (---------------) + I x 0x002027c1, // n0x0275 c0x0000 (---------------) + I y 0x002011c1, // n0x0276 c0x0000 (---------------) + I z 0x002104c3, // n0x0277 c0x0000 (---------------) + I com 0x002ceec3, // n0x0278 c0x0000 (---------------) + I edu 0x002150c3, // n0x0279 c0x0000 (---------------) + I gov 0x00239bc3, // n0x027a c0x0000 (---------------) + I net 0x002453c3, // n0x027b c0x0000 (---------------) + I org 0x00208f82, // n0x027c c0x0000 (---------------) + I co 0x002104c3, // n0x027d c0x0000 (---------------) + I com 0x002ceec3, // n0x027e c0x0000 (---------------) + I edu 0x00204282, // n0x027f c0x0000 (---------------) + I or 0x002453c3, // n0x0280 c0x0000 (---------------) + I org 0x00007546, // n0x0281 c0x0000 (---------------) + dyndns 0x00043a8a, // n0x0282 c0x0000 (---------------) + for-better 0x0006c508, // n0x0283 c0x0000 (---------------) + for-more 0x000440c8, // n0x0284 c0x0000 (---------------) + for-some 0x00044b07, // n0x0285 c0x0000 (---------------) + for-the 0x00108ec6, // n0x0286 c0x0000 (---------------) + selfip 0x00017306, // n0x0287 c0x0000 (---------------) + webhop 0x00202f44, // n0x0288 c0x0000 (---------------) + I asso 0x002f7707, // n0x0289 c0x0000 (---------------) + I barreau 0x00031c88, // n0x028a c0x0000 (---------------) + blogspot 0x0022fa44, // n0x028b c0x0000 (---------------) + I gouv 0x002104c3, // n0x028c c0x0000 (---------------) + I com 0x002ceec3, // n0x028d c0x0000 (---------------) + I edu 0x002150c3, // n0x028e c0x0000 (---------------) + I gov 0x00239bc3, // n0x028f c0x0000 (---------------) + I net 0x002453c3, // n0x0290 c0x0000 (---------------) + I org 0x002104c3, // n0x0291 c0x0000 (---------------) + I com 0x002ceec3, // n0x0292 c0x0000 (---------------) + I edu 0x00230083, // n0x0293 c0x0000 (---------------) + I gob 0x002150c3, // n0x0294 c0x0000 (---------------) + I gov 0x0021fe43, // n0x0295 c0x0000 (---------------) + I int 0x0025f683, // n0x0296 c0x0000 (---------------) + I mil 0x00239bc3, // n0x0297 c0x0000 (---------------) + I net 0x002453c3, // n0x0298 c0x0000 (---------------) + I org 0x0027ecc2, // n0x0299 c0x0000 (---------------) + I tv 0x002bc4c3, // n0x029a c0x0000 (---------------) + I adm 0x00257203, // n0x029b c0x0000 (---------------) + I adv 0x00206383, // n0x029c c0x0000 (---------------) + I agr 0x00200dc2, // n0x029d c0x0000 (---------------) + I am 0x0024b3c3, // n0x029e c0x0000 (---------------) + I arq 0x0020c703, // n0x029f c0x0000 (---------------) + I art 0x0020d6c3, // n0x02a0 c0x0000 (---------------) + I ato 0x00200001, // n0x02a1 c0x0000 (---------------) + I b 0x0020a503, // n0x02a2 c0x0000 (---------------) + I bio 0x0020be44, // n0x02a3 c0x0000 (---------------) + I blog 0x00210683, // n0x02a4 c0x0000 (---------------) + I bmd 0x00337fc3, // n0x02a5 c0x0000 (---------------) + I cim 0x002ea143, // n0x02a6 c0x0000 (---------------) + I cng 0x0022dc83, // n0x02a7 c0x0000 (---------------) + I cnt 0x0a2104c3, // n0x02a8 c0x0028 (n0x02df-n0x02e0) + I com 0x00236044, // n0x02a9 c0x0000 (---------------) + I coop 0x002ea103, // n0x02aa c0x0000 (---------------) + I ecn 0x0020c803, // n0x02ab c0x0000 (---------------) + I eco 0x002ceec3, // n0x02ac c0x0000 (---------------) + I edu 0x00234983, // n0x02ad c0x0000 (---------------) + I emp 0x0020bac3, // n0x02ae c0x0000 (---------------) + I eng 0x002584c3, // n0x02af c0x0000 (---------------) + I esp 0x00345f03, // n0x02b0 c0x0000 (---------------) + I etc 0x00221883, // n0x02b1 c0x0000 (---------------) + I eti 0x00223e03, // n0x02b2 c0x0000 (---------------) + I far 0x00242344, // n0x02b3 c0x0000 (---------------) + I flog 0x00332782, // n0x02b4 c0x0000 (---------------) + I fm 0x00243803, // n0x02b5 c0x0000 (---------------) + I fnd 0x002486c3, // n0x02b6 c0x0000 (---------------) + I fot 0x0025ffc3, // n0x02b7 c0x0000 (---------------) + I fst 0x0025fe43, // n0x02b8 c0x0000 (---------------) + I g12 0x00223d83, // n0x02b9 c0x0000 (---------------) + I ggf 0x002150c3, // n0x02ba c0x0000 (---------------) + I gov 0x002d3443, // n0x02bb c0x0000 (---------------) + I imb 0x0020ca83, // n0x02bc c0x0000 (---------------) + I ind 0x002180c3, // n0x02bd c0x0000 (---------------) + I inf 0x00207483, // n0x02be c0x0000 (---------------) + I jor 0x0028c903, // n0x02bf c0x0000 (---------------) + I jus 0x0021b643, // n0x02c0 c0x0000 (---------------) + I leg 0x0034b683, // n0x02c1 c0x0000 (---------------) + I lel 0x0020b603, // n0x02c2 c0x0000 (---------------) + I mat 0x002382c3, // n0x02c3 c0x0000 (---------------) + I med 0x0025f683, // n0x02c4 c0x0000 (---------------) + I mil 0x002aa903, // n0x02c5 c0x0000 (---------------) + I mus 0x00239bc3, // n0x02c6 c0x0000 (---------------) + I net 0x002006c3, // n0x02c7 c0x0000 (---------------) + I nom 0x00210083, // n0x02c8 c0x0000 (---------------) + I not 0x0022b003, // n0x02c9 c0x0000 (---------------) + I ntr 0x00230143, // n0x02ca c0x0000 (---------------) + I odo 0x002453c3, // n0x02cb c0x0000 (---------------) + I org 0x0031cdc3, // n0x02cc c0x0000 (---------------) + I ppg 0x002c5983, // n0x02cd c0x0000 (---------------) + I pro 0x00221943, // n0x02ce c0x0000 (---------------) + I psc 0x00273a83, // n0x02cf c0x0000 (---------------) + I psi 0x002c7b03, // n0x02d0 c0x0000 (---------------) + I qsl 0x00259085, // n0x02d1 c0x0000 (---------------) + I radio 0x002a8343, // n0x02d2 c0x0000 (---------------) + I rec 0x002d3d83, // n0x02d3 c0x0000 (---------------) + I slg 0x002dae83, // n0x02d4 c0x0000 (---------------) + I srv 0x0023bf04, // n0x02d5 c0x0000 (---------------) + I taxi 0x0026f0c3, // n0x02d6 c0x0000 (---------------) + I teo 0x0023d503, // n0x02d7 c0x0000 (---------------) + I tmp 0x002ac183, // n0x02d8 c0x0000 (---------------) + I trd 0x00201d03, // n0x02d9 c0x0000 (---------------) + I tur 0x0027ecc2, // n0x02da c0x0000 (---------------) + I tv 0x00237883, // n0x02db c0x0000 (---------------) + I vet 0x002e4d04, // n0x02dc c0x0000 (---------------) + I vlog 0x00324b04, // n0x02dd c0x0000 (---------------) + I wiki 0x002bea83, // n0x02de c0x0000 (---------------) + I zlg 0x00031c88, // n0x02df c0x0000 (---------------) + blogspot 0x002104c3, // n0x02e0 c0x0000 (---------------) + I com 0x002ceec3, // n0x02e1 c0x0000 (---------------) + I edu 0x002150c3, // n0x02e2 c0x0000 (---------------) + I gov 0x00239bc3, // n0x02e3 c0x0000 (---------------) + I net 0x002453c3, // n0x02e4 c0x0000 (---------------) + I org 0x002104c3, // n0x02e5 c0x0000 (---------------) + I com 0x002ceec3, // n0x02e6 c0x0000 (---------------) + I edu 0x002150c3, // n0x02e7 c0x0000 (---------------) + I gov 0x00239bc3, // n0x02e8 c0x0000 (---------------) + I net 0x002453c3, // n0x02e9 c0x0000 (---------------) + I org 0x00208f82, // n0x02ea c0x0000 (---------------) + I co 0x002453c3, // n0x02eb c0x0000 (---------------) + I org 0x002104c3, // n0x02ec c0x0000 (---------------) + I com 0x002150c3, // n0x02ed c0x0000 (---------------) + I gov 0x0025f683, // n0x02ee c0x0000 (---------------) + I mil 0x00216f82, // n0x02ef c0x0000 (---------------) + I of 0x002104c3, // n0x02f0 c0x0000 (---------------) + I com 0x002ceec3, // n0x02f1 c0x0000 (---------------) + I edu 0x002150c3, // n0x02f2 c0x0000 (---------------) + I gov 0x00239bc3, // n0x02f3 c0x0000 (---------------) + I net 0x002453c3, // n0x02f4 c0x0000 (---------------) + I org 0x00202a82, // n0x02f5 c0x0000 (---------------) + I ab 0x003234c2, // n0x02f6 c0x0000 (---------------) + I bc 0x00031c88, // n0x02f7 c0x0000 (---------------) + blogspot 0x00008f82, // n0x02f8 c0x0000 (---------------) + co 0x002a9182, // n0x02f9 c0x0000 (---------------) + I gc 0x00206302, // n0x02fa c0x0000 (---------------) + I mb 0x00224bc2, // n0x02fb c0x0000 (---------------) + I nb 0x00218102, // n0x02fc c0x0000 (---------------) + I nf 0x00231642, // n0x02fd c0x0000 (---------------) + I nl 0x00207642, // n0x02fe c0x0000 (---------------) + I ns 0x00204e02, // n0x02ff c0x0000 (---------------) + I nt 0x00252942, // n0x0300 c0x0000 (---------------) + I nu 0x00200342, // n0x0301 c0x0000 (---------------) + I on 0x00208682, // n0x0302 c0x0000 (---------------) + I pe 0x0022d342, // n0x0303 c0x0000 (---------------) + I qc 0x002033c2, // n0x0304 c0x0000 (---------------) + I sk 0x0028af82, // n0x0305 c0x0000 (---------------) + I yk 0x00011309, // n0x0306 c0x0000 (---------------) + ftpaccess 0x000db38b, // n0x0307 c0x0000 (---------------) + game-server 0x000b9dc8, // n0x0308 c0x0000 (---------------) + myphotos 0x000b19c9, // n0x0309 c0x0000 (---------------) + scrapping 0x002150c3, // n0x030a c0x0000 (---------------) + I gov 0x00031c88, // n0x030b c0x0000 (---------------) + blogspot 0x00031c88, // n0x030c c0x0000 (---------------) + blogspot 0x002028c2, // n0x030d c0x0000 (---------------) + I ac 0x00202f44, // n0x030e c0x0000 (---------------) + I asso 0x00208f82, // n0x030f c0x0000 (---------------) + I co 0x002104c3, // n0x0310 c0x0000 (---------------) + I com 0x00203582, // n0x0311 c0x0000 (---------------) + I ed 0x002ceec3, // n0x0312 c0x0000 (---------------) + I edu 0x002053c2, // n0x0313 c0x0000 (---------------) + I go 0x0022fa44, // n0x0314 c0x0000 (---------------) + I gouv 0x0021fe43, // n0x0315 c0x0000 (---------------) + I int 0x002106c2, // n0x0316 c0x0000 (---------------) + I md 0x00239bc3, // n0x0317 c0x0000 (---------------) + I net 0x00204282, // n0x0318 c0x0000 (---------------) + I or 0x002453c3, // n0x0319 c0x0000 (---------------) + I org 0x0020e2c6, // n0x031a c0x0000 (---------------) + I presse 0x002e85cf, // n0x031b c0x0000 (---------------) + I xn--aroport-bya 0x0063b483, // n0x031c c0x0001 (---------------) ! I www 0x00208f82, // n0x031d c0x0000 (---------------) + I co 0x00230083, // n0x031e c0x0000 (---------------) + I gob 0x002150c3, // n0x031f c0x0000 (---------------) + I gov 0x0025f683, // n0x0320 c0x0000 (---------------) + I mil 0x002150c3, // n0x0321 c0x0000 (---------------) + I gov 0x002028c2, // n0x0322 c0x0000 (---------------) + I ac 0x00203682, // n0x0323 c0x0000 (---------------) + I ah 0x0020eb42, // n0x0324 c0x0000 (---------------) + I bj 0x002104c3, // n0x0325 c0x0000 (---------------) + I com 0x00238e42, // n0x0326 c0x0000 (---------------) + I cq 0x002ceec3, // n0x0327 c0x0000 (---------------) + I edu 0x00207442, // n0x0328 c0x0000 (---------------) + I fj 0x0020bf02, // n0x0329 c0x0000 (---------------) + I gd 0x002150c3, // n0x032a c0x0000 (---------------) + I gov 0x00223142, // n0x032b c0x0000 (---------------) + I gs 0x00269242, // n0x032c c0x0000 (---------------) + I gx 0x00270542, // n0x032d c0x0000 (---------------) + I gz 0x00200a42, // n0x032e c0x0000 (---------------) + I ha 0x002e77c2, // n0x032f c0x0000 (---------------) + I hb 0x002036c2, // n0x0330 c0x0000 (---------------) + I he 0x00200202, // n0x0331 c0x0000 (---------------) + I hi 0x0022e542, // n0x0332 c0x0000 (---------------) + I hk 0x00221a02, // n0x0333 c0x0000 (---------------) + I hl 0x00264042, // n0x0334 c0x0000 (---------------) + I hn 0x00310fc2, // n0x0335 c0x0000 (---------------) + I jl 0x002e0bc2, // n0x0336 c0x0000 (---------------) + I js 0x002ef242, // n0x0337 c0x0000 (---------------) + I jx 0x0022bfc2, // n0x0338 c0x0000 (---------------) + I ln 0x0025f683, // n0x0339 c0x0000 (---------------) + I mil 0x0020a782, // n0x033a c0x0000 (---------------) + I mo 0x00239bc3, // n0x033b c0x0000 (---------------) + I net 0x0020ad82, // n0x033c c0x0000 (---------------) + I nm 0x002f0c42, // n0x033d c0x0000 (---------------) + I nx 0x002453c3, // n0x033e c0x0000 (---------------) + I org 0x00238e82, // n0x033f c0x0000 (---------------) + I qh 0x00201e42, // n0x0340 c0x0000 (---------------) + I sc 0x0024db82, // n0x0341 c0x0000 (---------------) + I sd 0x002001c2, // n0x0342 c0x0000 (---------------) + I sh 0x00202002, // n0x0343 c0x0000 (---------------) + I sn 0x002e1042, // n0x0344 c0x0000 (---------------) + I sx 0x0023fb82, // n0x0345 c0x0000 (---------------) + I tj 0x00247802, // n0x0346 c0x0000 (---------------) + I tw 0x00318a02, // n0x0347 c0x0000 (---------------) + I xj 0x002d370a, // n0x0348 c0x0000 (---------------) + I xn--55qx5d 0x0031010a, // n0x0349 c0x0000 (---------------) + I xn--io0a7i 0x0032da4a, // n0x034a c0x0000 (---------------) + I xn--od0alg 0x00353b82, // n0x034b c0x0000 (---------------) + I xz 0x00207582, // n0x034c c0x0000 (---------------) + I yn 0x002dac42, // n0x034d c0x0000 (---------------) + I zj 0x0023fec4, // n0x034e c0x0000 (---------------) + I arts 0x002104c3, // n0x034f c0x0000 (---------------) + I com 0x002ceec3, // n0x0350 c0x0000 (---------------) + I edu 0x00240684, // n0x0351 c0x0000 (---------------) + I firm 0x002150c3, // n0x0352 c0x0000 (---------------) + I gov 0x002180c4, // n0x0353 c0x0000 (---------------) + I info 0x0021fe43, // n0x0354 c0x0000 (---------------) + I int 0x0025f683, // n0x0355 c0x0000 (---------------) + I mil 0x00239bc3, // n0x0356 c0x0000 (---------------) + I net 0x002006c3, // n0x0357 c0x0000 (---------------) + I nom 0x002453c3, // n0x0358 c0x0000 (---------------) + I org 0x002a8343, // n0x0359 c0x0000 (---------------) + I rec 0x00209243, // n0x035a c0x0000 (---------------) + I web 0x0eab77c9, // n0x035b c0x003a (n0x0414-n0x042b) o I amazonaws 0x00098407, // n0x035c c0x0000 (---------------) + appspot 0x00003902, // n0x035d c0x0000 (---------------) + ar 0x0014ff0a, // n0x035e c0x0000 (---------------) + betainabox 0x0000be47, // n0x035f c0x0000 (---------------) + blogdns 0x00031c88, // n0x0360 c0x0000 (---------------) + blogspot 0x00003e42, // n0x0361 c0x0000 (---------------) + br 0x00006887, // n0x0362 c0x0000 (---------------) + cechire 0x0005f84f, // n0x0363 c0x0000 (---------------) + cloudcontrolapp 0x0002ae4f, // n0x0364 c0x0000 (---------------) + cloudcontrolled 0x0002dc82, // n0x0365 c0x0000 (---------------) + cn 0x00058408, // n0x0366 c0x0000 (---------------) + codespot 0x00009102, // n0x0367 c0x0000 (---------------) + de 0x00032888, // n0x0368 c0x0000 (---------------) + dnsalias 0x0005a447, // n0x0369 c0x0000 (---------------) + dnsdojo 0x0002eb4b, // n0x036a c0x0000 (---------------) + doesntexist 0x0010c549, // n0x036b c0x0000 (---------------) + dontexist 0x00032787, // n0x036c c0x0000 (---------------) + doomdns 0x0014b18c, // n0x036d c0x0000 (---------------) + dreamhosters 0x0014958a, // n0x036e c0x0000 (---------------) + dyn-o-saur 0x00078ac8, // n0x036f c0x0000 (---------------) + dynalias 0x0004634e, // n0x0370 c0x0000 (---------------) + dyndns-at-home 0x0000754e, // n0x0371 c0x0000 (---------------) + dyndns-at-work 0x0000bc8b, // n0x0372 c0x0000 (---------------) + dyndns-blog 0x0001070b, // n0x0373 c0x0000 (---------------) + dyndns-free 0x0001104b, // n0x0374 c0x0000 (---------------) + dyndns-home 0x00014209, // n0x0375 c0x0000 (---------------) + dyndns-ip 0x0001644b, // n0x0376 c0x0000 (---------------) + dyndns-mail 0x00016dcd, // n0x0377 c0x0000 (---------------) + dyndns-office 0x0001b18b, // n0x0378 c0x0000 (---------------) + dyndns-pics 0x0001f7cd, // n0x0379 c0x0000 (---------------) + dyndns-remote 0x0002d80d, // n0x037a c0x0000 (---------------) + dyndns-server 0x000bf3ca, // n0x037b c0x0000 (---------------) + dyndns-web 0x0012494b, // n0x037c c0x0000 (---------------) + dyndns-wiki 0x00027c0b, // n0x037d c0x0000 (---------------) + dyndns-work 0x0001ccd0, // n0x037e c0x0000 (---------------) + elasticbeanstalk 0x0001684f, // n0x037f c0x0000 (---------------) + est-a-la-maison 0x0005d7cf, // n0x0380 c0x0000 (---------------) + est-a-la-masion 0x00036d8d, // n0x0381 c0x0000 (---------------) + est-le-patron 0x00021c10, // n0x0382 c0x0000 (---------------) + est-mon-blogueur 0x0000f502, // n0x0383 c0x0000 (---------------) + eu 0x0004ac47, // n0x0384 c0x0000 (---------------) + from-ak 0x0004b0c7, // n0x0385 c0x0000 (---------------) + from-al 0x0004b287, // n0x0386 c0x0000 (---------------) + from-ar 0x0004b7c7, // n0x0387 c0x0000 (---------------) + from-ca 0x0004c387, // n0x0388 c0x0000 (---------------) + from-ct 0x0004c607, // n0x0389 c0x0000 (---------------) + from-dc 0x0004c947, // n0x038a c0x0000 (---------------) + from-de 0x0004ce87, // n0x038b c0x0000 (---------------) + from-fl 0x0004d987, // n0x038c c0x0000 (---------------) + from-ga 0x0004dc87, // n0x038d c0x0000 (---------------) + from-hi 0x0004e287, // n0x038e c0x0000 (---------------) + from-ia 0x0004e447, // n0x038f c0x0000 (---------------) + from-id 0x0004e607, // n0x0390 c0x0000 (---------------) + from-il 0x0004e7c7, // n0x0391 c0x0000 (---------------) + from-in 0x0004eac7, // n0x0392 c0x0000 (---------------) + from-ks 0x0004f1c7, // n0x0393 c0x0000 (---------------) + from-ky 0x000502c7, // n0x0394 c0x0000 (---------------) + from-ma 0x00050b07, // n0x0395 c0x0000 (---------------) + from-md 0x00051647, // n0x0396 c0x0000 (---------------) + from-mi 0x00051bc7, // n0x0397 c0x0000 (---------------) + from-mn 0x00051d87, // n0x0398 c0x0000 (---------------) + from-mo 0x00052747, // n0x0399 c0x0000 (---------------) + from-ms 0x00052d47, // n0x039a c0x0000 (---------------) + from-mt 0x00054787, // n0x039b c0x0000 (---------------) + from-nc 0x00055707, // n0x039c c0x0000 (---------------) + from-nd 0x000558c7, // n0x039d c0x0000 (---------------) + from-ne 0x00055a87, // n0x039e c0x0000 (---------------) + from-nh 0x000561c7, // n0x039f c0x0000 (---------------) + from-nj 0x00056787, // n0x03a0 c0x0000 (---------------) + from-nm 0x00057587, // n0x03a1 c0x0000 (---------------) + from-nv 0x00057dc7, // n0x03a2 c0x0000 (---------------) + from-oh 0x00058007, // n0x03a3 c0x0000 (---------------) + from-ok 0x00058847, // n0x03a4 c0x0000 (---------------) + from-or 0x00058b07, // n0x03a5 c0x0000 (---------------) + from-pa 0x00059707, // n0x03a6 c0x0000 (---------------) + from-pr 0x00059907, // n0x03a7 c0x0000 (---------------) + from-ri 0x0005ad47, // n0x03a8 c0x0000 (---------------) + from-sc 0x0005b147, // n0x03a9 c0x0000 (---------------) + from-sd 0x0005b307, // n0x03aa c0x0000 (---------------) + from-tn 0x0005b4c7, // n0x03ab c0x0000 (---------------) + from-tx 0x0005bac7, // n0x03ac c0x0000 (---------------) + from-ut 0x0005c087, // n0x03ad c0x0000 (---------------) + from-va 0x0005c447, // n0x03ae c0x0000 (---------------) + from-vt 0x0005c747, // n0x03af c0x0000 (---------------) + from-wa 0x0005c907, // n0x03b0 c0x0000 (---------------) + from-wi 0x0005cc87, // n0x03b1 c0x0000 (---------------) + from-wv 0x0005e847, // n0x03b2 c0x0000 (---------------) + from-wy 0x00072c02, // n0x03b3 c0x0000 (---------------) + gb 0x0004bac7, // n0x03b4 c0x0000 (---------------) + getmyip 0x00042e8a, // n0x03b5 c0x0000 (---------------) + googleapis 0x0005828a, // n0x03b6 c0x0000 (---------------) + googlecode 0x00045446, // n0x03b7 c0x0000 (---------------) + gotdns 0x000063c2, // n0x03b8 c0x0000 (---------------) + gr 0x00098289, // n0x03b9 c0x0000 (---------------) + herokuapp 0x00048789, // n0x03ba c0x0000 (---------------) + herokussl 0x0003970a, // n0x03bb c0x0000 (---------------) + hobby-site 0x00089109, // n0x03bc c0x0000 (---------------) + homelinux 0x000896c8, // n0x03bd c0x0000 (---------------) + homeunix 0x0003d6c2, // n0x03be c0x0000 (---------------) + hu 0x0005a089, // n0x03bf c0x0000 (---------------) + iamallama 0x0006e28e, // n0x03c0 c0x0000 (---------------) + is-a-anarchist 0x0000cd0c, // n0x03c1 c0x0000 (---------------) + is-a-blogger 0x000ba18f, // n0x03c2 c0x0000 (---------------) + is-a-bookkeeper 0x0007c70e, // n0x03c3 c0x0000 (---------------) + is-a-bulls-fan 0x0008a3cc, // n0x03c4 c0x0000 (---------------) + is-a-caterer 0x00105049, // n0x03c5 c0x0000 (---------------) + is-a-chef 0x0002a751, // n0x03c6 c0x0000 (---------------) + is-a-conservative 0x0002cb88, // n0x03c7 c0x0000 (---------------) + is-a-cpa 0x0003e692, // n0x03c8 c0x0000 (---------------) + is-a-cubicle-slave 0x0003f88d, // n0x03c9 c0x0000 (---------------) + is-a-democrat 0x00052a0d, // n0x03ca c0x0000 (---------------) + is-a-designer 0x00055f0b, // n0x03cb c0x0000 (---------------) + is-a-doctor 0x00056e95, // n0x03cc c0x0000 (---------------) + is-a-financialadvisor 0x0005a6c9, // n0x03cd c0x0000 (---------------) + is-a-geek 0x0006468a, // n0x03ce c0x0000 (---------------) + is-a-green 0x00067289, // n0x03cf c0x0000 (---------------) + is-a-guru 0x00067810, // n0x03d0 c0x0000 (---------------) + is-a-hard-worker 0x0006d78b, // n0x03d1 c0x0000 (---------------) + is-a-hunter 0x0006fe0f, // n0x03d2 c0x0000 (---------------) + is-a-landscaper 0x00077d0b, // n0x03d3 c0x0000 (---------------) + is-a-lawyer 0x0007d70c, // n0x03d4 c0x0000 (---------------) + is-a-liberal 0x000842d0, // n0x03d5 c0x0000 (---------------) + is-a-libertarian 0x00093b0a, // n0x03d6 c0x0000 (---------------) + is-a-llama 0x000aa7cd, // n0x03d7 c0x0000 (---------------) + is-a-musician 0x000f394e, // n0x03d8 c0x0000 (---------------) + is-a-nascarfan 0x00092a4a, // n0x03d9 c0x0000 (---------------) + is-a-nurse 0x000933cc, // n0x03da c0x0000 (---------------) + is-a-painter 0x000976d4, // n0x03db c0x0000 (---------------) + is-a-personaltrainer 0x00097f11, // n0x03dc c0x0000 (---------------) + is-a-photographer 0x0009c90b, // n0x03dd c0x0000 (---------------) + is-a-player 0x0009d54f, // n0x03de c0x0000 (---------------) + is-a-republican 0x000a0c0d, // n0x03df c0x0000 (---------------) + is-a-rockstar 0x000a3e4e, // n0x03e0 c0x0000 (---------------) + is-a-socialist 0x000ab0cc, // n0x03e1 c0x0000 (---------------) + is-a-student 0x000ba78c, // n0x03e2 c0x0000 (---------------) + is-a-teacher 0x000aa4cb, // n0x03e3 c0x0000 (---------------) + is-a-techie 0x000af5ce, // n0x03e4 c0x0000 (---------------) + is-a-therapist 0x000b2410, // n0x03e5 c0x0000 (---------------) + is-an-accountant 0x000c730b, // n0x03e6 c0x0000 (---------------) + is-an-actor 0x000bd20d, // n0x03e7 c0x0000 (---------------) + is-an-actress 0x000fdccf, // n0x03e8 c0x0000 (---------------) + is-an-anarchist 0x00101a8c, // n0x03e9 c0x0000 (---------------) + is-an-artist 0x0012608e, // n0x03ea c0x0000 (---------------) + is-an-engineer 0x000c8291, // n0x03eb c0x0000 (---------------) + is-an-entertainer 0x000cec4c, // n0x03ec c0x0000 (---------------) + is-certified 0x000d0587, // n0x03ed c0x0000 (---------------) + is-gone 0x000d1a0d, // n0x03ee c0x0000 (---------------) + is-into-anime 0x000d51cc, // n0x03ef c0x0000 (---------------) + is-into-cars 0x000da650, // n0x03f0 c0x0000 (---------------) + is-into-cartoons 0x000dc58d, // n0x03f1 c0x0000 (---------------) + is-into-games 0x000debc7, // n0x03f2 c0x0000 (---------------) + is-leet 0x000e8c90, // n0x03f3 c0x0000 (---------------) + is-not-certified 0x000f5b08, // n0x03f4 c0x0000 (---------------) + is-slick 0x0010324b, // n0x03f5 c0x0000 (---------------) + is-uberleet 0x0012f98f, // n0x03f6 c0x0000 (---------------) + is-with-theband 0x00043088, // n0x03f7 c0x0000 (---------------) + isa-geek 0x00054d4d, // n0x03f8 c0x0000 (---------------) + isa-hockeynut 0x0008e790, // n0x03f9 c0x0000 (---------------) + issmarterthanyou 0x00090083, // n0x03fa c0x0000 (---------------) + jpn 0x00003b82, // n0x03fb c0x0000 (---------------) + kr 0x00038909, // n0x03fc c0x0000 (---------------) + likes-pie 0x0004614a, // n0x03fd c0x0000 (---------------) + likescandy 0x0005f388, // n0x03fe c0x0000 (---------------) + neat-url 0x000006c2, // n0x03ff c0x0000 (---------------) + no 0x000360ca, // n0x0400 c0x0000 (---------------) + operaunite 0x0002d342, // n0x0401 c0x0000 (---------------) + qc 0x0005f7c7, // n0x0402 c0x0000 (---------------) + rhcloud 0x00003a82, // n0x0403 c0x0000 (---------------) + ro 0x00003e82, // n0x0404 c0x0000 (---------------) + ru 0x00000cc2, // n0x0405 c0x0000 (---------------) + sa 0x000bd510, // n0x0406 c0x0000 (---------------) + saves-the-whales 0x00000482, // n0x0407 c0x0000 (---------------) + se 0x00108ec6, // n0x0408 c0x0000 (---------------) + selfip 0x0007f24e, // n0x0409 c0x0000 (---------------) + sells-for-less 0x00092c4b, // n0x040a c0x0000 (---------------) + sells-for-u 0x000c10c8, // n0x040b c0x0000 (---------------) + servebbs 0x000d398a, // n0x040c c0x0000 (---------------) + simple-url 0x000d7f4d, // n0x040d c0x0000 (---------------) + space-to-rent 0x000fae8c, // n0x040e c0x0000 (---------------) + teaches-yoga 0x00003ec2, // n0x040f c0x0000 (---------------) + uk 0x00002342, // n0x0410 c0x0000 (---------------) + us 0x0001d142, // n0x0411 c0x0000 (---------------) + uy 0x00031a0e, // n0x0412 c0x0000 (---------------) + writesthisblog 0x00002702, // n0x0413 c0x0000 (---------------) + za 0x0ec30c47, // n0x0414 c0x003b (n0x042b-n0x0433) + compute 0x0f030c49, // n0x0415 c0x003c (n0x0433-n0x0435) + compute-1 0x00020fc3, // n0x0416 c0x0000 (---------------) + elb 0x00002282, // n0x0417 c0x0000 (---------------) + s3 0x000b79d1, // n0x0418 c0x0000 (---------------) + s3-ap-northeast-1 0x0010b411, // n0x0419 c0x0000 (---------------) + s3-ap-southeast-1 0x000d92d1, // n0x041a c0x0000 (---------------) + s3-ap-southeast-2 0x0014f74c, // n0x041b c0x0000 (---------------) + s3-eu-west-1 0x00100bd5, // n0x041c c0x0000 (---------------) + s3-fips-us-gov-west-1 0x0013fb0c, // n0x041d c0x0000 (---------------) + s3-sa-east-1 0x001430d0, // n0x041e c0x0000 (---------------) + s3-us-gov-west-1 0x0000228c, // n0x041f c0x0000 (---------------) + s3-us-west-1 0x0000444c, // n0x0420 c0x0000 (---------------) + s3-us-west-2 0x00009199, // n0x0421 c0x0000 (---------------) + s3-website-ap-northeast-1 0x00009ed9, // n0x0422 c0x0000 (---------------) + s3-website-ap-southeast-1 0x0000bfd9, // n0x0423 c0x0000 (---------------) + s3-website-ap-southeast-2 0x0000f254, // n0x0424 c0x0000 (---------------) + s3-website-eu-west-1 0x00011514, // n0x0425 c0x0000 (---------------) + s3-website-sa-east-1 0x00011c94, // n0x0426 c0x0000 (---------------) + s3-website-us-east-1 0x00014d58, // n0x0427 c0x0000 (---------------) + s3-website-us-gov-west-1 0x0001e494, // n0x0428 c0x0000 (---------------) + s3-website-us-west-1 0x000221d4, // n0x0429 c0x0000 (---------------) + s3-website-us-west-2 0x00011f49, // n0x042a c0x0000 (---------------) + us-east-1 0x0000944e, // n0x042b c0x0000 (---------------) + ap-northeast-1 0x0000a18e, // n0x042c c0x0000 (---------------) + ap-southeast-1 0x0000c28e, // n0x042d c0x0000 (---------------) + ap-southeast-2 0x0000f509, // n0x042e c0x0000 (---------------) + eu-west-1 0x000117c9, // n0x042f c0x0000 (---------------) + sa-east-1 0x0001500d, // n0x0430 c0x0000 (---------------) + us-gov-west-1 0x00002349, // n0x0431 c0x0000 (---------------) + us-west-1 0x00004509, // n0x0432 c0x0000 (---------------) + us-west-2 0x00139503, // n0x0433 c0x0000 (---------------) + z-1 0x00023a03, // n0x0434 c0x0000 (---------------) + z-2 0x002028c2, // n0x0435 c0x0000 (---------------) + I ac 0x00208f82, // n0x0436 c0x0000 (---------------) + I co 0x00203582, // n0x0437 c0x0000 (---------------) + I ed 0x00201ac2, // n0x0438 c0x0000 (---------------) + I fi 0x002053c2, // n0x0439 c0x0000 (---------------) + I go 0x00204282, // n0x043a c0x0000 (---------------) + I or 0x00200cc2, // n0x043b c0x0000 (---------------) + I sa 0x002104c3, // n0x043c c0x0000 (---------------) + I com 0x002ceec3, // n0x043d c0x0000 (---------------) + I edu 0x002150c3, // n0x043e c0x0000 (---------------) + I gov 0x002180c3, // n0x043f c0x0000 (---------------) + I inf 0x00239bc3, // n0x0440 c0x0000 (---------------) + I net 0x002453c3, // n0x0441 c0x0000 (---------------) + I org 0x00031c88, // n0x0442 c0x0000 (---------------) + blogspot 0x002104c3, // n0x0443 c0x0000 (---------------) + I com 0x002ceec3, // n0x0444 c0x0000 (---------------) + I edu 0x00239bc3, // n0x0445 c0x0000 (---------------) + I net 0x002453c3, // n0x0446 c0x0000 (---------------) + I org 0x00011bc3, // n0x0447 c0x0000 (---------------) + ath 0x002150c3, // n0x0448 c0x0000 (---------------) + I gov 0x00031c88, // n0x0449 c0x0000 (---------------) + blogspot 0x00031c88, // n0x044a c0x0000 (---------------) + blogspot 0x000104c3, // n0x044b c0x0000 (---------------) + com 0x000d0b4f, // n0x044c c0x0000 (---------------) + fuettertdasnetz 0x0002ed4a, // n0x044d c0x0000 (---------------) + isteingeek 0x0010c6c7, // n0x044e c0x0000 (---------------) + istmein 0x00039a4a, // n0x044f c0x0000 (---------------) + lebtimnetz 0x0012a7ca, // n0x0450 c0x0000 (---------------) + leitungsen 0x0011b64d, // n0x0451 c0x0000 (---------------) + traeumtgerade 0x00031c88, // n0x0452 c0x0000 (---------------) + blogspot 0x002104c3, // n0x0453 c0x0000 (---------------) + I com 0x002ceec3, // n0x0454 c0x0000 (---------------) + I edu 0x002150c3, // n0x0455 c0x0000 (---------------) + I gov 0x00239bc3, // n0x0456 c0x0000 (---------------) + I net 0x002453c3, // n0x0457 c0x0000 (---------------) + I org 0x0020c703, // n0x0458 c0x0000 (---------------) + I art 0x002104c3, // n0x0459 c0x0000 (---------------) + I com 0x002ceec3, // n0x045a c0x0000 (---------------) + I edu 0x00230083, // n0x045b c0x0000 (---------------) + I gob 0x002150c3, // n0x045c c0x0000 (---------------) + I gov 0x0025f683, // n0x045d c0x0000 (---------------) + I mil 0x00239bc3, // n0x045e c0x0000 (---------------) + I net 0x002453c3, // n0x045f c0x0000 (---------------) + I org 0x002c7b43, // n0x0460 c0x0000 (---------------) + I sld 0x00209243, // n0x0461 c0x0000 (---------------) + I web 0x0020c703, // n0x0462 c0x0000 (---------------) + I art 0x00202f44, // n0x0463 c0x0000 (---------------) + I asso 0x002104c3, // n0x0464 c0x0000 (---------------) + I com 0x002ceec3, // n0x0465 c0x0000 (---------------) + I edu 0x002150c3, // n0x0466 c0x0000 (---------------) + I gov 0x00239bc3, // n0x0467 c0x0000 (---------------) + I net 0x002453c3, // n0x0468 c0x0000 (---------------) + I org 0x0020cc43, // n0x0469 c0x0000 (---------------) + I pol 0x002104c3, // n0x046a c0x0000 (---------------) + I com 0x002ceec3, // n0x046b c0x0000 (---------------) + I edu 0x0023fdc3, // n0x046c c0x0000 (---------------) + I fin 0x00230083, // n0x046d c0x0000 (---------------) + I gob 0x002150c3, // n0x046e c0x0000 (---------------) + I gov 0x002180c4, // n0x046f c0x0000 (---------------) + I info 0x002edec3, // n0x0470 c0x0000 (---------------) + I k12 0x002382c3, // n0x0471 c0x0000 (---------------) + I med 0x0025f683, // n0x0472 c0x0000 (---------------) + I mil 0x00239bc3, // n0x0473 c0x0000 (---------------) + I net 0x002453c3, // n0x0474 c0x0000 (---------------) + I org 0x002c5983, // n0x0475 c0x0000 (---------------) + I pro 0x0025f203, // n0x0476 c0x0000 (---------------) + I aip 0x002104c3, // n0x0477 c0x0000 (---------------) + I com 0x002ceec3, // n0x0478 c0x0000 (---------------) + I edu 0x0023dbc3, // n0x0479 c0x0000 (---------------) + I fie 0x002150c3, // n0x047a c0x0000 (---------------) + I gov 0x00208d43, // n0x047b c0x0000 (---------------) + I lib 0x002382c3, // n0x047c c0x0000 (---------------) + I med 0x002453c3, // n0x047d c0x0000 (---------------) + I org 0x00223043, // n0x047e c0x0000 (---------------) + I pri 0x0020d884, // n0x047f c0x0000 (---------------) + I riik 0x002104c3, // n0x0480 c0x0000 (---------------) + I com 0x002ceec3, // n0x0481 c0x0000 (---------------) + I edu 0x00289783, // n0x0482 c0x0000 (---------------) + I eun 0x002150c3, // n0x0483 c0x0000 (---------------) + I gov 0x0025f683, // n0x0484 c0x0000 (---------------) + I mil 0x002d16c4, // n0x0485 c0x0000 (---------------) + I name 0x00239bc3, // n0x0486 c0x0000 (---------------) + I net 0x002453c3, // n0x0487 c0x0000 (---------------) + I org 0x00201e43, // n0x0488 c0x0000 (---------------) + I sci 0x132104c3, // n0x0489 c0x004c (n0x048e-n0x048f) + I com 0x002ceec3, // n0x048a c0x0000 (---------------) + I edu 0x00230083, // n0x048b c0x0000 (---------------) + I gob 0x002006c3, // n0x048c c0x0000 (---------------) + I nom 0x002453c3, // n0x048d c0x0000 (---------------) + I org 0x00031c88, // n0x048e c0x0000 (---------------) + blogspot 0x002a7085, // n0x048f c0x0000 (---------------) + I aland 0x00031c88, // n0x0490 c0x0000 (---------------) + blogspot 0x00005c03, // n0x0491 c0x0000 (---------------) + iki 0x002fa248, // n0x0492 c0x0000 (---------------) + I aeroport 0x002a0387, // n0x0493 c0x0000 (---------------) + I assedic 0x00202f44, // n0x0494 c0x0000 (---------------) + I asso 0x002f7d06, // n0x0495 c0x0000 (---------------) + I avocat 0x0030b2c6, // n0x0496 c0x0000 (---------------) + I avoues 0x00031c88, // n0x0497 c0x0000 (---------------) + blogspot 0x002f29c3, // n0x0498 c0x0000 (---------------) + I cci 0x00206249, // n0x0499 c0x0000 (---------------) + I chambagri 0x002cbbd5, // n0x049a c0x0000 (---------------) + I chirurgiens-dentistes 0x002104c3, // n0x049b c0x0000 (---------------) + I com 0x00300792, // n0x049c c0x0000 (---------------) + I experts-comptables 0x0030054f, // n0x049d c0x0000 (---------------) + I geometre-expert 0x0022fa44, // n0x049e c0x0000 (---------------) + I gouv 0x0023a385, // n0x049f c0x0000 (---------------) + I greta 0x0028c6d0, // n0x04a0 c0x0000 (---------------) + I huissier-justice 0x002910c7, // n0x04a1 c0x0000 (---------------) + I medecin 0x002006c3, // n0x04a2 c0x0000 (---------------) + I nom 0x00253e08, // n0x04a3 c0x0000 (---------------) + I notaires 0x002bb40a, // n0x04a4 c0x0000 (---------------) + I pharmacien 0x0029fc44, // n0x04a5 c0x0000 (---------------) + I port 0x00259843, // n0x04a6 c0x0000 (---------------) + I prd 0x0020e2c6, // n0x04a7 c0x0000 (---------------) + I presse 0x0023d502, // n0x04a8 c0x0000 (---------------) + I tm 0x002c670b, // n0x04a9 c0x0000 (---------------) + I veterinaire 0x002104c3, // n0x04aa c0x0000 (---------------) + I com 0x002ceec3, // n0x04ab c0x0000 (---------------) + I edu 0x002150c3, // n0x04ac c0x0000 (---------------) + I gov 0x0025f683, // n0x04ad c0x0000 (---------------) + I mil 0x00239bc3, // n0x04ae c0x0000 (---------------) + I net 0x002453c3, // n0x04af c0x0000 (---------------) + I org 0x002c75c3, // n0x04b0 c0x0000 (---------------) + I pvt 0x00208f82, // n0x04b1 c0x0000 (---------------) + I co 0x002150c3, // n0x04b2 c0x0000 (---------------) + I gov 0x00239bc3, // n0x04b3 c0x0000 (---------------) + I net 0x002453c3, // n0x04b4 c0x0000 (---------------) + I org 0x00204343, // n0x04b5 c0x0000 (---------------) + I sch 0x002104c3, // n0x04b6 c0x0000 (---------------) + I com 0x002ceec3, // n0x04b7 c0x0000 (---------------) + I edu 0x002150c3, // n0x04b8 c0x0000 (---------------) + I gov 0x0025f683, // n0x04b9 c0x0000 (---------------) + I mil 0x002453c3, // n0x04ba c0x0000 (---------------) + I org 0x002104c3, // n0x04bb c0x0000 (---------------) + I com 0x002ceec3, // n0x04bc c0x0000 (---------------) + I edu 0x002150c3, // n0x04bd c0x0000 (---------------) + I gov 0x00231743, // n0x04be c0x0000 (---------------) + I ltd 0x00250983, // n0x04bf c0x0000 (---------------) + I mod 0x002453c3, // n0x04c0 c0x0000 (---------------) + I org 0x002028c2, // n0x04c1 c0x0000 (---------------) + I ac 0x002104c3, // n0x04c2 c0x0000 (---------------) + I com 0x002ceec3, // n0x04c3 c0x0000 (---------------) + I edu 0x002150c3, // n0x04c4 c0x0000 (---------------) + I gov 0x00239bc3, // n0x04c5 c0x0000 (---------------) + I net 0x002453c3, // n0x04c6 c0x0000 (---------------) + I org 0x00202f44, // n0x04c7 c0x0000 (---------------) + I asso 0x002104c3, // n0x04c8 c0x0000 (---------------) + I com 0x002ceec3, // n0x04c9 c0x0000 (---------------) + I edu 0x0020adc4, // n0x04ca c0x0000 (---------------) + I mobi 0x00239bc3, // n0x04cb c0x0000 (---------------) + I net 0x002453c3, // n0x04cc c0x0000 (---------------) + I org 0x00031c88, // n0x04cd c0x0000 (---------------) + blogspot 0x002104c3, // n0x04ce c0x0000 (---------------) + I com 0x002ceec3, // n0x04cf c0x0000 (---------------) + I edu 0x002150c3, // n0x04d0 c0x0000 (---------------) + I gov 0x00239bc3, // n0x04d1 c0x0000 (---------------) + I net 0x002453c3, // n0x04d2 c0x0000 (---------------) + I org 0x002104c3, // n0x04d3 c0x0000 (---------------) + I com 0x002ceec3, // n0x04d4 c0x0000 (---------------) + I edu 0x00230083, // n0x04d5 c0x0000 (---------------) + I gob 0x0020ca83, // n0x04d6 c0x0000 (---------------) + I ind 0x0025f683, // n0x04d7 c0x0000 (---------------) + I mil 0x00239bc3, // n0x04d8 c0x0000 (---------------) + I net 0x002453c3, // n0x04d9 c0x0000 (---------------) + I org 0x00208f82, // n0x04da c0x0000 (---------------) + I co 0x002104c3, // n0x04db c0x0000 (---------------) + I com 0x00239bc3, // n0x04dc c0x0000 (---------------) + I net 0x00031c88, // n0x04dd c0x0000 (---------------) + blogspot 0x002104c3, // n0x04de c0x0000 (---------------) + I com 0x002ceec3, // n0x04df c0x0000 (---------------) + I edu 0x002150c3, // n0x04e0 c0x0000 (---------------) + I gov 0x0025a343, // n0x04e1 c0x0000 (---------------) + I idv 0x00239bc3, // n0x04e2 c0x0000 (---------------) + I net 0x002453c3, // n0x04e3 c0x0000 (---------------) + I org 0x002d370a, // n0x04e4 c0x0000 (---------------) + I xn--55qx5d 0x002f5ec9, // n0x04e5 c0x0000 (---------------) + I xn--ciqpn 0x00307bcb, // n0x04e6 c0x0000 (---------------) + I xn--gmq050i 0x0030850a, // n0x04e7 c0x0000 (---------------) + I xn--gmqw5a 0x0031010a, // n0x04e8 c0x0000 (---------------) + I xn--io0a7i 0x003177cb, // n0x04e9 c0x0000 (---------------) + I xn--lcvr32d 0x0032680a, // n0x04ea c0x0000 (---------------) + I xn--mk0axi 0x0032a44a, // n0x04eb c0x0000 (---------------) + I xn--mxtq1m 0x0032da4a, // n0x04ec c0x0000 (---------------) + I xn--od0alg 0x0032dccb, // n0x04ed c0x0000 (---------------) + I xn--od0aq3b 0x003437c9, // n0x04ee c0x0000 (---------------) + I xn--tn0ag 0x0034748a, // n0x04ef c0x0000 (---------------) + I xn--uc0atv 0x0034794b, // n0x04f0 c0x0000 (---------------) + I xn--uc0ay4a 0x0034c54b, // n0x04f1 c0x0000 (---------------) + I xn--wcvs22d 0x0035248a, // n0x04f2 c0x0000 (---------------) + I xn--zf0avx 0x002104c3, // n0x04f3 c0x0000 (---------------) + I com 0x002ceec3, // n0x04f4 c0x0000 (---------------) + I edu 0x00230083, // n0x04f5 c0x0000 (---------------) + I gob 0x0025f683, // n0x04f6 c0x0000 (---------------) + I mil 0x00239bc3, // n0x04f7 c0x0000 (---------------) + I net 0x002453c3, // n0x04f8 c0x0000 (---------------) + I org 0x002104c3, // n0x04f9 c0x0000 (---------------) + I com 0x0024ac44, // n0x04fa c0x0000 (---------------) + I from 0x00201182, // n0x04fb c0x0000 (---------------) + I iz 0x002d16c4, // n0x04fc c0x0000 (---------------) + I name 0x0027a0c5, // n0x04fd c0x0000 (---------------) + I adult 0x0020c703, // n0x04fe c0x0000 (---------------) + I art 0x00202f44, // n0x04ff c0x0000 (---------------) + I asso 0x002104c3, // n0x0500 c0x0000 (---------------) + I com 0x00236044, // n0x0501 c0x0000 (---------------) + I coop 0x002ceec3, // n0x0502 c0x0000 (---------------) + I edu 0x00240684, // n0x0503 c0x0000 (---------------) + I firm 0x0022fa44, // n0x0504 c0x0000 (---------------) + I gouv 0x002180c4, // n0x0505 c0x0000 (---------------) + I info 0x002382c3, // n0x0506 c0x0000 (---------------) + I med 0x00239bc3, // n0x0507 c0x0000 (---------------) + I net 0x002453c3, // n0x0508 c0x0000 (---------------) + I org 0x00297805, // n0x0509 c0x0000 (---------------) + I perso 0x0020cc43, // n0x050a c0x0000 (---------------) + I pol 0x002c5983, // n0x050b c0x0000 (---------------) + I pro 0x00202143, // n0x050c c0x0000 (---------------) + I rel 0x00227ec4, // n0x050d c0x0000 (---------------) + I shop 0x0025fec4, // n0x050e c0x0000 (---------------) + I 2000 0x003073c5, // n0x050f c0x0000 (---------------) + I agrar 0x00031c88, // n0x0510 c0x0000 (---------------) + blogspot 0x002e3604, // n0x0511 c0x0000 (---------------) + I bolt 0x002160c6, // n0x0512 c0x0000 (---------------) + I casino 0x00225ec4, // n0x0513 c0x0000 (---------------) + I city 0x00208f82, // n0x0514 c0x0000 (---------------) + I co 0x00299407, // n0x0515 c0x0000 (---------------) + I erotica 0x003443c7, // n0x0516 c0x0000 (---------------) + I erotika 0x0023f584, // n0x0517 c0x0000 (---------------) + I film 0x00247cc5, // n0x0518 c0x0000 (---------------) + I forum 0x002dc785, // n0x0519 c0x0000 (---------------) + I games 0x0028ba85, // n0x051a c0x0000 (---------------) + I hotel 0x002180c4, // n0x051b c0x0000 (---------------) + I info 0x002da288, // n0x051c c0x0000 (---------------) + I ingatlan 0x002eca86, // n0x051d c0x0000 (---------------) + I jogasz 0x00353648, // n0x051e c0x0000 (---------------) + I konyvelo 0x00219f05, // n0x051f c0x0000 (---------------) + I lakas 0x002e2905, // n0x0520 c0x0000 (---------------) + I media 0x0030cc44, // n0x0521 c0x0000 (---------------) + I news 0x002453c3, // n0x0522 c0x0000 (---------------) + I org 0x002c5804, // n0x0523 c0x0000 (---------------) + I priv 0x002065c6, // n0x0524 c0x0000 (---------------) + I reklam 0x0020e3c3, // n0x0525 c0x0000 (---------------) + I sex 0x00227ec4, // n0x0526 c0x0000 (---------------) + I shop 0x0034a985, // n0x0527 c0x0000 (---------------) + I sport 0x00238884, // n0x0528 c0x0000 (---------------) + I suli 0x0021c2c4, // n0x0529 c0x0000 (---------------) + I szex 0x0023d502, // n0x052a c0x0000 (---------------) + I tm 0x002ab386, // n0x052b c0x0000 (---------------) + I tozsde 0x0033a246, // n0x052c c0x0000 (---------------) + I utazas 0x002e24c5, // n0x052d c0x0000 (---------------) + I video 0x002028c2, // n0x052e c0x0000 (---------------) + I ac 0x002b5183, // n0x052f c0x0000 (---------------) + I biz 0x00208f82, // n0x0530 c0x0000 (---------------) + I co 0x002053c2, // n0x0531 c0x0000 (---------------) + I go 0x0025f683, // n0x0532 c0x0000 (---------------) + I mil 0x002246c2, // n0x0533 c0x0000 (---------------) + I my 0x00239bc3, // n0x0534 c0x0000 (---------------) + I net 0x00204282, // n0x0535 c0x0000 (---------------) + I or 0x00204343, // n0x0536 c0x0000 (---------------) + I sch 0x00209243, // n0x0537 c0x0000 (---------------) + I web 0x00031c88, // n0x0538 c0x0000 (---------------) + blogspot 0x002150c3, // n0x0539 c0x0000 (---------------) + I gov 0x18208f82, // n0x053a c0x0060 (n0x053b-n0x053c) o I co 0x00031c88, // n0x053b c0x0000 (---------------) + blogspot 0x002028c2, // n0x053c c0x0000 (---------------) + I ac 0x18a08f82, // n0x053d c0x0062 (n0x0542-n0x0544) + I co 0x002150c3, // n0x053e c0x0000 (---------------) + I gov 0x00239bc3, // n0x053f c0x0000 (---------------) + I net 0x002131c3, // n0x0540 c0x0000 (---------------) + I nic 0x002453c3, // n0x0541 c0x0000 (---------------) + I org 0x00231743, // n0x0542 c0x0000 (---------------) + I ltd 0x002c1843, // n0x0543 c0x0000 (---------------) + I plc 0x002028c2, // n0x0544 c0x0000 (---------------) + I ac 0x00031c88, // n0x0545 c0x0000 (---------------) + blogspot 0x00208f82, // n0x0546 c0x0000 (---------------) + I co 0x002ceec3, // n0x0547 c0x0000 (---------------) + I edu 0x00240684, // n0x0548 c0x0000 (---------------) + I firm 0x00205ec3, // n0x0549 c0x0000 (---------------) + I gen 0x002150c3, // n0x054a c0x0000 (---------------) + I gov 0x0020ca83, // n0x054b c0x0000 (---------------) + I ind 0x0025f683, // n0x054c c0x0000 (---------------) + I mil 0x00239bc3, // n0x054d c0x0000 (---------------) + I net 0x002131c3, // n0x054e c0x0000 (---------------) + I nic 0x002453c3, // n0x054f c0x0000 (---------------) + I org 0x0020e303, // n0x0550 c0x0000 (---------------) + I res 0x00100113, // n0x0551 c0x0000 (---------------) + barrel-of-knowledge 0x0010acd4, // n0x0552 c0x0000 (---------------) + barrell-of-knowledge 0x00007546, // n0x0553 c0x0000 (---------------) + dyndns 0x00043f07, // n0x0554 c0x0000 (---------------) + for-our 0x000fc0c9, // n0x0555 c0x0000 (---------------) + groks-the 0x0013088a, // n0x0556 c0x0000 (---------------) + groks-this 0x0006c3cd, // n0x0557 c0x0000 (---------------) + here-for-more 0x000754ca, // n0x0558 c0x0000 (---------------) + knowsitall 0x00108ec6, // n0x0559 c0x0000 (---------------) + selfip 0x00017306, // n0x055a c0x0000 (---------------) + webhop 0x0020f502, // n0x055b c0x0000 (---------------) + I eu 0x002104c3, // n0x055c c0x0000 (---------------) + I com 0x000a6206, // n0x055d c0x0000 (---------------) + github 0x002104c3, // n0x055e c0x0000 (---------------) + I com 0x002ceec3, // n0x055f c0x0000 (---------------) + I edu 0x002150c3, // n0x0560 c0x0000 (---------------) + I gov 0x0025f683, // n0x0561 c0x0000 (---------------) + I mil 0x00239bc3, // n0x0562 c0x0000 (---------------) + I net 0x002453c3, // n0x0563 c0x0000 (---------------) + I org 0x002028c2, // n0x0564 c0x0000 (---------------) + I ac 0x00208f82, // n0x0565 c0x0000 (---------------) + I co 0x002150c3, // n0x0566 c0x0000 (---------------) + I gov 0x0020ab82, // n0x0567 c0x0000 (---------------) + I id 0x00239bc3, // n0x0568 c0x0000 (---------------) + I net 0x002453c3, // n0x0569 c0x0000 (---------------) + I org 0x00204343, // n0x056a c0x0000 (---------------) + I sch 0x00321a0f, // n0x056b c0x0000 (---------------) + I xn--mgba3a4f16a 0x00321dce, // n0x056c c0x0000 (---------------) + I xn--mgba3a4fra 0x002104c3, // n0x056d c0x0000 (---------------) + I com 0x002ceec3, // n0x056e c0x0000 (---------------) + I edu 0x002150c3, // n0x056f c0x0000 (---------------) + I gov 0x0021fe43, // n0x0570 c0x0000 (---------------) + I int 0x00239bc3, // n0x0571 c0x0000 (---------------) + I net 0x002453c3, // n0x0572 c0x0000 (---------------) + I org 0x00204882, // n0x0573 c0x0000 (---------------) + I ag 0x00343989, // n0x0574 c0x0000 (---------------) + I agrigento 0x00201dc2, // n0x0575 c0x0000 (---------------) + I al 0x002bd80b, // n0x0576 c0x0000 (---------------) + I alessandria 0x00232eca, // n0x0577 c0x0000 (---------------) + I alto-adige 0x002ecec9, // n0x0578 c0x0000 (---------------) + I altoadige 0x00200a82, // n0x0579 c0x0000 (---------------) + I an 0x00291406, // n0x057a c0x0000 (---------------) + I ancona 0x002deed5, // n0x057b c0x0000 (---------------) + I andria-barletta-trani 0x002bd955, // n0x057c c0x0000 (---------------) + I andria-trani-barletta 0x00303613, // n0x057d c0x0000 (---------------) + I andriabarlettatrani 0x002bded3, // n0x057e c0x0000 (---------------) + I andriatranibarletta 0x00200d02, // n0x057f c0x0000 (---------------) + I ao 0x00224e05, // n0x0580 c0x0000 (---------------) + I aosta 0x002a8d85, // n0x0581 c0x0000 (---------------) + I aoste 0x00208602, // n0x0582 c0x0000 (---------------) + I ap 0x00269742, // n0x0583 c0x0000 (---------------) + I aq 0x002b9006, // n0x0584 c0x0000 (---------------) + I aquila 0x00203902, // n0x0585 c0x0000 (---------------) + I ar 0x0026f306, // n0x0586 c0x0000 (---------------) + I arezzo 0x00278c4d, // n0x0587 c0x0000 (---------------) + I ascoli-piceno 0x00232a0c, // n0x0588 c0x0000 (---------------) + I ascolipiceno 0x0021cd44, // n0x0589 c0x0000 (---------------) + I asti 0x00200982, // n0x058a c0x0000 (---------------) + I at 0x0020e042, // n0x058b c0x0000 (---------------) + I av 0x0029ed88, // n0x058c c0x0000 (---------------) + I avellino 0x00201242, // n0x058d c0x0000 (---------------) + I ba 0x002b4a86, // n0x058e c0x0000 (---------------) + I balsan 0x00234384, // n0x058f c0x0000 (---------------) + I bari 0x002df095, // n0x0590 c0x0000 (---------------) + I barletta-trani-andria 0x00303793, // n0x0591 c0x0000 (---------------) + I barlettatraniandria 0x0031cb07, // n0x0592 c0x0000 (---------------) + I belluno 0x003094c9, // n0x0593 c0x0000 (---------------) + I benevento 0x002ed6c7, // n0x0594 c0x0000 (---------------) + I bergamo 0x0033c7c2, // n0x0595 c0x0000 (---------------) + I bg 0x00200002, // n0x0596 c0x0000 (---------------) + I bi 0x002014c6, // n0x0597 c0x0000 (---------------) + I biella 0x0020be42, // n0x0598 c0x0000 (---------------) + I bl 0x00031c88, // n0x0599 c0x0000 (---------------) + blogspot 0x002a96c2, // n0x059a c0x0000 (---------------) + I bn 0x00207c82, // n0x059b c0x0000 (---------------) + I bo 0x0033dfc7, // n0x059c c0x0000 (---------------) + I bologna 0x00210d47, // n0x059d c0x0000 (---------------) + I bolzano 0x002182c5, // n0x059e c0x0000 (---------------) + I bozen 0x00203e42, // n0x059f c0x0000 (---------------) + I br 0x00219ac7, // n0x05a0 c0x0000 (---------------) + I brescia 0x00219c88, // n0x05a1 c0x0000 (---------------) + I brindisi 0x002092c2, // n0x05a2 c0x0000 (---------------) + I bs 0x00239ac2, // n0x05a3 c0x0000 (---------------) + I bt 0x00225d42, // n0x05a4 c0x0000 (---------------) + I bz 0x00200402, // n0x05a5 c0x0000 (---------------) + I ca 0x0021b788, // n0x05a6 c0x0000 (---------------) + I cagliari 0x002383cd, // n0x05a7 c0x0000 (---------------) + I caltanissetta 0x002443cf, // n0x05a8 c0x0000 (---------------) + I campidano-medio 0x0024478e, // n0x05a9 c0x0000 (---------------) + I campidanomedio 0x00202dca, // n0x05aa c0x0000 (---------------) + I campobasso 0x00220451, // n0x05ab c0x0000 (---------------) + I carbonia-iglesias 0x002208d0, // n0x05ac c0x0000 (---------------) + I carboniaiglesias 0x00271b8d, // n0x05ad c0x0000 (---------------) + I carrara-massa 0x00271ecc, // n0x05ae c0x0000 (---------------) + I carraramassa 0x00200407, // n0x05af c0x0000 (---------------) + I caserta 0x002f7dc7, // n0x05b0 c0x0000 (---------------) + I catania 0x0022d389, // n0x05b1 c0x0000 (---------------) + I catanzaro 0x0021ce42, // n0x05b2 c0x0000 (---------------) + I cb 0x00201982, // n0x05b3 c0x0000 (---------------) + I ce 0x00245c0c, // n0x05b4 c0x0000 (---------------) + I cesena-forli 0x00245f0b, // n0x05b5 c0x0000 (---------------) + I cesenaforli 0x00200a02, // n0x05b6 c0x0000 (---------------) + I ch 0x002aa686, // n0x05b7 c0x0000 (---------------) + I chieti 0x00201e82, // n0x05b8 c0x0000 (---------------) + I ci 0x00200b42, // n0x05b9 c0x0000 (---------------) + I cl 0x0022dc82, // n0x05ba c0x0000 (---------------) + I cn 0x00208f82, // n0x05bb c0x0000 (---------------) + I co 0x002104c4, // n0x05bc c0x0000 (---------------) + I como 0x00237b07, // n0x05bd c0x0000 (---------------) + I cosenza 0x00239282, // n0x05be c0x0000 (---------------) + I cr 0x0023adc7, // n0x05bf c0x0000 (---------------) + I cremona 0x0023b6c7, // n0x05c0 c0x0000 (---------------) + I crotone 0x0021b3c2, // n0x05c1 c0x0000 (---------------) + I cs 0x00231542, // n0x05c2 c0x0000 (---------------) + I ct 0x0023c9c5, // n0x05c3 c0x0000 (---------------) + I cuneo 0x002026c2, // n0x05c4 c0x0000 (---------------) + I cz 0x0024710e, // n0x05c5 c0x0000 (---------------) + I dell-ogliastra 0x0024ca8d, // n0x05c6 c0x0000 (---------------) + I dellogliastra 0x002ceec3, // n0x05c7 c0x0000 (---------------) + I edu 0x00201f02, // n0x05c8 c0x0000 (---------------) + I en 0x0024f9c4, // n0x05c9 c0x0000 (---------------) + I enna 0x002bf1c2, // n0x05ca c0x0000 (---------------) + I fc 0x00232102, // n0x05cb c0x0000 (---------------) + I fe 0x002c5f45, // n0x05cc c0x0000 (---------------) + I fermo 0x00321847, // n0x05cd c0x0000 (---------------) + I ferrara 0x00330842, // n0x05ce c0x0000 (---------------) + I fg 0x00201ac2, // n0x05cf c0x0000 (---------------) + I fi 0x002404c7, // n0x05d0 c0x0000 (---------------) + I firenze 0x00242908, // n0x05d1 c0x0000 (---------------) + I florence 0x00332782, // n0x05d2 c0x0000 (---------------) + I fm 0x00218146, // n0x05d3 c0x0000 (---------------) + I foggia 0x00245a8c, // n0x05d4 c0x0000 (---------------) + I forli-cesena 0x00245dcb, // n0x05d5 c0x0000 (---------------) + I forlicesena 0x002108c2, // n0x05d6 c0x0000 (---------------) + I fr 0x0025ea09, // n0x05d7 c0x0000 (---------------) + I frosinone 0x00201302, // n0x05d8 c0x0000 (---------------) + I ge 0x0020d385, // n0x05d9 c0x0000 (---------------) + I genoa 0x00212ec6, // n0x05da c0x0000 (---------------) + I genova 0x002053c2, // n0x05db c0x0000 (---------------) + I go 0x002b01c7, // n0x05dc c0x0000 (---------------) + I gorizia 0x002150c3, // n0x05dd c0x0000 (---------------) + I gov 0x002063c2, // n0x05de c0x0000 (---------------) + I gr 0x0023e088, // n0x05df c0x0000 (---------------) + I grosseto 0x00220691, // n0x05e0 c0x0000 (---------------) + I iglesias-carbonia 0x00220ad0, // n0x05e1 c0x0000 (---------------) + I iglesiascarbonia 0x0020e682, // n0x05e2 c0x0000 (---------------) + I im 0x0020f907, // n0x05e3 c0x0000 (---------------) + I imperia 0x002005c2, // n0x05e4 c0x0000 (---------------) + I is 0x00237347, // n0x05e5 c0x0000 (---------------) + I isernia 0x00203b82, // n0x05e6 c0x0000 (---------------) + I kr 0x0029c509, // n0x05e7 c0x0000 (---------------) + I la-spezia 0x002b8fc7, // n0x05e8 c0x0000 (---------------) + I laquila 0x00259f08, // n0x05e9 c0x0000 (---------------) + I laspezia 0x002a2186, // n0x05ea c0x0000 (---------------) + I latina 0x00213702, // n0x05eb c0x0000 (---------------) + I lc 0x002018c2, // n0x05ec c0x0000 (---------------) + I le 0x002018c5, // n0x05ed c0x0000 (---------------) + I lecce 0x00239e05, // n0x05ee c0x0000 (---------------) + I lecco 0x00208d42, // n0x05ef c0x0000 (---------------) + I li 0x00351847, // n0x05f0 c0x0000 (---------------) + I livorno 0x00200b82, // n0x05f1 c0x0000 (---------------) + I lo 0x00246b44, // n0x05f2 c0x0000 (---------------) + I lodi 0x00206502, // n0x05f3 c0x0000 (---------------) + I lt 0x00209882, // n0x05f4 c0x0000 (---------------) + I lu 0x00220385, // n0x05f5 c0x0000 (---------------) + I lucca 0x002f3108, // n0x05f6 c0x0000 (---------------) + I macerata 0x00287487, // n0x05f7 c0x0000 (---------------) + I mantova 0x00271a0d, // n0x05f8 c0x0000 (---------------) + I massa-carrara 0x00271d8c, // n0x05f9 c0x0000 (---------------) + I massacarrara 0x002969c6, // n0x05fa c0x0000 (---------------) + I matera 0x00206302, // n0x05fb c0x0000 (---------------) + I mb 0x002c95c2, // n0x05fc c0x0000 (---------------) + I mc 0x00208202, // n0x05fd c0x0000 (---------------) + I me 0x0024424f, // n0x05fe c0x0000 (---------------) + I medio-campidano 0x0024464e, // n0x05ff c0x0000 (---------------) + I mediocampidano 0x002eaac7, // n0x0600 c0x0000 (---------------) + I messina 0x00200e02, // n0x0601 c0x0000 (---------------) + I mi 0x002a79c5, // n0x0602 c0x0000 (---------------) + I milan 0x002a79c6, // n0x0603 c0x0000 (---------------) + I milano 0x00203cc2, // n0x0604 c0x0000 (---------------) + I mn 0x0020a782, // n0x0605 c0x0000 (---------------) + I mo 0x00282406, // n0x0606 c0x0000 (---------------) + I modena 0x002add05, // n0x0607 c0x0000 (---------------) + I monza 0x002add0d, // n0x0608 c0x0000 (---------------) + I monza-brianza 0x002ae055, // n0x0609 c0x0000 (---------------) + I monza-e-della-brianza 0x002ae58c, // n0x060a c0x0000 (---------------) + I monzabrianza 0x002ae88d, // n0x060b c0x0000 (---------------) + I monzaebrianza 0x002aebd2, // n0x060c c0x0000 (---------------) + I monzaedellabrianza 0x00222fc2, // n0x060d c0x0000 (---------------) + I ms 0x00252e82, // n0x060e c0x0000 (---------------) + I mt 0x00201c82, // n0x060f c0x0000 (---------------) + I na 0x00322146, // n0x0610 c0x0000 (---------------) + I naples 0x0020cbc6, // n0x0611 c0x0000 (---------------) + I napoli 0x002006c2, // n0x0612 c0x0000 (---------------) + I no 0x00212f46, // n0x0613 c0x0000 (---------------) + I novara 0x00252942, // n0x0614 c0x0000 (---------------) + I nu 0x00350345, // n0x0615 c0x0000 (---------------) + I nuoro 0x00205242, // n0x0616 c0x0000 (---------------) + I og 0x00247249, // n0x0617 c0x0000 (---------------) + I ogliastra 0x0029024c, // n0x0618 c0x0000 (---------------) + I olbia-tempio 0x0029058b, // n0x0619 c0x0000 (---------------) + I olbiatempio 0x00204282, // n0x061a c0x0000 (---------------) + I or 0x00304448, // n0x061b c0x0000 (---------------) + I oristano 0x00208fc2, // n0x061c c0x0000 (---------------) + I ot 0x00211382, // n0x061d c0x0000 (---------------) + I pa 0x0021f006, // n0x061e c0x0000 (---------------) + I padova 0x00322e85, // n0x061f c0x0000 (---------------) + I padua 0x00214407, // n0x0620 c0x0000 (---------------) + I palermo 0x00287a85, // n0x0621 c0x0000 (---------------) + I parma 0x002bb105, // n0x0622 c0x0000 (---------------) + I pavia 0x002cea02, // n0x0623 c0x0000 (---------------) + I pc 0x00227fc2, // n0x0624 c0x0000 (---------------) + I pd 0x00208682, // n0x0625 c0x0000 (---------------) + I pe 0x00270107, // n0x0626 c0x0000 (---------------) + I perugia 0x002c4b0d, // n0x0627 c0x0000 (---------------) + I pesaro-urbino 0x002c4e8c, // n0x0628 c0x0000 (---------------) + I pesarourbino 0x002bb247, // n0x0629 c0x0000 (---------------) + I pescara 0x0031ce02, // n0x062a c0x0000 (---------------) + I pg 0x0021b342, // n0x062b c0x0000 (---------------) + I pi 0x0024ff48, // n0x062c c0x0000 (---------------) + I piacenza 0x00243044, // n0x062d c0x0000 (---------------) + I pisa 0x002af847, // n0x062e c0x0000 (---------------) + I pistoia 0x002900c2, // n0x062f c0x0000 (---------------) + I pn 0x00202e82, // n0x0630 c0x0000 (---------------) + I po 0x002c3909, // n0x0631 c0x0000 (---------------) + I pordenone 0x00298507, // n0x0632 c0x0000 (---------------) + I potenza 0x0020e2c2, // n0x0633 c0x0000 (---------------) + I pr 0x0031dd05, // n0x0634 c0x0000 (---------------) + I prato 0x002c6682, // n0x0635 c0x0000 (---------------) + I pt 0x0020a982, // n0x0636 c0x0000 (---------------) + I pu 0x002c75c2, // n0x0637 c0x0000 (---------------) + I pv 0x002c7a42, // n0x0638 c0x0000 (---------------) + I pz 0x00201d82, // n0x0639 c0x0000 (---------------) + I ra 0x002fb286, // n0x063a c0x0000 (---------------) + I ragusa 0x0028de47, // n0x063b c0x0000 (---------------) + I ravenna 0x002281c2, // n0x063c c0x0000 (---------------) + I rc 0x00202142, // n0x063d c0x0000 (---------------) + I re 0x002b154f, // n0x063e c0x0000 (---------------) + I reggio-calabria 0x002c694d, // n0x063f c0x0000 (---------------) + I reggio-emilia 0x0021a80e, // n0x0640 c0x0000 (---------------) + I reggiocalabria 0x0034cd0c, // n0x0641 c0x0000 (---------------) + I reggioemilia 0x00208882, // n0x0642 c0x0000 (---------------) + I rg 0x002042c2, // n0x0643 c0x0000 (---------------) + I ri 0x00221805, // n0x0644 c0x0000 (---------------) + I rieti 0x002894c6, // n0x0645 c0x0000 (---------------) + I rimini 0x00214502, // n0x0646 c0x0000 (---------------) + I rm 0x00215a02, // n0x0647 c0x0000 (---------------) + I rn 0x00203a82, // n0x0648 c0x0000 (---------------) + I ro 0x002952c4, // n0x0649 c0x0000 (---------------) + I roma 0x00291044, // n0x064a c0x0000 (---------------) + I rome 0x00242d86, // n0x064b c0x0000 (---------------) + I rovigo 0x00200cc2, // n0x064c c0x0000 (---------------) + I sa 0x0029ff07, // n0x064d c0x0000 (---------------) + I salerno 0x0027d587, // n0x064e c0x0000 (---------------) + I sassari 0x002fe486, // n0x064f c0x0000 (---------------) + I savona 0x00205a42, // n0x0650 c0x0000 (---------------) + I si 0x00273ac5, // n0x0651 c0x0000 (---------------) + I siena 0x0025bc88, // n0x0652 c0x0000 (---------------) + I siracusa 0x00202fc2, // n0x0653 c0x0000 (---------------) + I so 0x00333d87, // n0x0654 c0x0000 (---------------) + I sondrio 0x00223002, // n0x0655 c0x0000 (---------------) + I sp 0x002b1502, // n0x0656 c0x0000 (---------------) + I sr 0x00202f82, // n0x0657 c0x0000 (---------------) + I ss 0x00307149, // n0x0658 c0x0000 (---------------) + I suedtirol 0x00201702, // n0x0659 c0x0000 (---------------) + I sv 0x00200542, // n0x065a c0x0000 (---------------) + I ta 0x0021eb47, // n0x065b c0x0000 (---------------) + I taranto 0x00201402, // n0x065c c0x0000 (---------------) + I te 0x002903cc, // n0x065d c0x0000 (---------------) + I tempio-olbia 0x002906cb, // n0x065e c0x0000 (---------------) + I tempioolbia 0x00296a46, // n0x065f c0x0000 (---------------) + I teramo 0x002d7945, // n0x0660 c0x0000 (---------------) + I terni 0x0020ff42, // n0x0661 c0x0000 (---------------) + I tn 0x00200302, // n0x0662 c0x0000 (---------------) + I to 0x0029b9c6, // n0x0663 c0x0000 (---------------) + I torino 0x00211342, // n0x0664 c0x0000 (---------------) + I tp 0x00209942, // n0x0665 c0x0000 (---------------) + I tr 0x002ded55, // n0x0666 c0x0000 (---------------) + I trani-andria-barletta 0x002bdb15, // n0x0667 c0x0000 (---------------) + I trani-barletta-andria 0x003034d3, // n0x0668 c0x0000 (---------------) + I traniandriabarletta 0x002be053, // n0x0669 c0x0000 (---------------) + I tranibarlettaandria 0x0034aa87, // n0x066a c0x0000 (---------------) + I trapani 0x002b3e48, // n0x066b c0x0000 (---------------) + I trentino 0x002b80c6, // n0x066c c0x0000 (---------------) + I trento 0x002b8e07, // n0x066d c0x0000 (---------------) + I treviso 0x002c6307, // n0x066e c0x0000 (---------------) + I trieste 0x002030c2, // n0x066f c0x0000 (---------------) + I ts 0x002cc585, // n0x0670 c0x0000 (---------------) + I turin 0x0027ecc2, // n0x0671 c0x0000 (---------------) + I tv 0x00203802, // n0x0672 c0x0000 (---------------) + I ud 0x002787c5, // n0x0673 c0x0000 (---------------) + I udine 0x002c4ccd, // n0x0674 c0x0000 (---------------) + I urbino-pesaro 0x002c500c, // n0x0675 c0x0000 (---------------) + I urbinopesaro 0x00202b82, // n0x0676 c0x0000 (---------------) + I va 0x002c3146, // n0x0677 c0x0000 (---------------) + I varese 0x00223b02, // n0x0678 c0x0000 (---------------) + I vb 0x00233d02, // n0x0679 c0x0000 (---------------) + I vc 0x00205902, // n0x067a c0x0000 (---------------) + I ve 0x0028b0c7, // n0x067b c0x0000 (---------------) + I venezia 0x0021f246, // n0x067c c0x0000 (---------------) + I venice 0x0022da88, // n0x067d c0x0000 (---------------) + I verbania 0x002db588, // n0x067e c0x0000 (---------------) + I vercelli 0x0025ce06, // n0x067f c0x0000 (---------------) + I verona 0x0020afc2, // n0x0680 c0x0000 (---------------) + I vi 0x002e1e8d, // n0x0681 c0x0000 (---------------) + I vibo-valentia 0x002e21cc, // n0x0682 c0x0000 (---------------) + I vibovalentia 0x0022fb07, // n0x0683 c0x0000 (---------------) + I vicenza 0x002e34c7, // n0x0684 c0x0000 (---------------) + I viterbo 0x0020e1c2, // n0x0685 c0x0000 (---------------) + I vr 0x00244f82, // n0x0686 c0x0000 (---------------) + I vs 0x0025c582, // n0x0687 c0x0000 (---------------) + I vt 0x0022e842, // n0x0688 c0x0000 (---------------) + I vv 0x00208f82, // n0x0689 c0x0000 (---------------) + I co 0x002150c3, // n0x068a c0x0000 (---------------) + I gov 0x00239bc3, // n0x068b c0x0000 (---------------) + I net 0x002453c3, // n0x068c c0x0000 (---------------) + I org 0x00204343, // n0x068d c0x0000 (---------------) + I sch 0x002104c3, // n0x068e c0x0000 (---------------) + I com 0x002ceec3, // n0x068f c0x0000 (---------------) + I edu 0x002150c3, // n0x0690 c0x0000 (---------------) + I gov 0x0025f683, // n0x0691 c0x0000 (---------------) + I mil 0x002d16c4, // n0x0692 c0x0000 (---------------) + I name 0x00239bc3, // n0x0693 c0x0000 (---------------) + I net 0x002453c3, // n0x0694 c0x0000 (---------------) + I org 0x00204343, // n0x0695 c0x0000 (---------------) + I sch 0x002028c2, // n0x0696 c0x0000 (---------------) + I ac 0x00202742, // n0x0697 c0x0000 (---------------) + I ad 0x1ba76685, // n0x0698 c0x006e (n0x06d6-n0x070b) + I aichi 0x1be3a905, // n0x0699 c0x006f (n0x070b-n0x0727) + I akita 0x1c2f9546, // n0x069a c0x0070 (n0x0727-n0x073d) + I aomori 0x00031c88, // n0x069b c0x0000 (---------------) + blogspot 0x1c69c185, // n0x069c c0x0071 (n0x073d-n0x0777) + I chiba 0x00208f82, // n0x069d c0x0000 (---------------) + I co 0x00203582, // n0x069e c0x0000 (---------------) + I ed 0x1caa6bc5, // n0x069f c0x0072 (n0x0777-n0x078d) + I ehime 0x1ce64585, // n0x06a0 c0x0073 (n0x078d-n0x079c) + I fukui 0x1d264bc7, // n0x06a1 c0x0074 (n0x079c-n0x07db) + I fukuoka 0x1d627489, // n0x06a2 c0x0075 (n0x07db-n0x080e) + I fukushima 0x1db2e104, // n0x06a3 c0x0076 (n0x080e-n0x0834) + I gifu 0x002053c2, // n0x06a4 c0x0000 (---------------) + I go 0x002063c2, // n0x06a5 c0x0000 (---------------) + I gr 0x1de4a645, // n0x06a6 c0x0077 (n0x0834-n0x0858) + I gunma 0x1e274349, // n0x06a7 c0x0078 (n0x0858-n0x0871) + I hiroshima 0x1e694bc8, // n0x06a8 c0x0079 (n0x0871-n0x08ff) + I hokkaido 0x1eabd085, // n0x06a9 c0x007a (n0x08ff-n0x092d) + I hyogo 0x1ef29287, // n0x06aa c0x007b (n0x092d-n0x0960) + I ibaraki 0x1f2a2c88, // n0x06ab c0x007c (n0x0960-n0x0973) + I ishikawa 0x1f68f885, // n0x06ac c0x007d (n0x0973-n0x0996) + I iwate 0x1fa04846, // n0x06ad c0x007e (n0x0996-n0x09a5) + I kagawa 0x1ff4f049, // n0x06ae c0x007f (n0x09a5-n0x09b9) + I kagoshima 0x202fa088, // n0x06af c0x0080 (n0x09b9-n0x09d7) + I kanagawa 0x206a0a48, // n0x06b0 c0x0081 (n0x09d7-n0x09d8)* o I kawasaki 0x20ab37ca, // n0x06b1 c0x0082 (n0x09d8-n0x09d9)* o I kitakyushu 0x20eb5584, // n0x06b2 c0x0083 (n0x09d9-n0x09da)* o I kobe 0x212b2f45, // n0x06b3 c0x0084 (n0x09da-n0x09f9) + I kochi 0x21618c48, // n0x06b4 c0x0085 (n0x09f9-n0x0a13) + I kumamoto 0x21a4f305, // n0x06b5 c0x0086 (n0x0a13-n0x0a32) + I kyoto 0x002132c2, // n0x06b6 c0x0000 (---------------) + I lg 0x21e01803, // n0x06b7 c0x0087 (n0x0a32-n0x0a50) + I mie 0x22286f46, // n0x06b8 c0x0088 (n0x0a50-n0x0a71) + I miyagi 0x22677b48, // n0x06b9 c0x0089 (n0x0a71-n0x0a8c) + I miyazaki 0x22b0f046, // n0x06ba c0x008a (n0x0a8c-n0x0ad7) + I nagano 0x22ee9c88, // n0x06bb c0x008b (n0x0ad7-n0x0aed) + I nagasaki 0x23205346, // n0x06bc c0x008c (n0x0aed-n0x0aee)* o I nagoya 0x23734484, // n0x06bd c0x008d (n0x0aee-n0x0b14) + I nara 0x00205f42, // n0x06be c0x0000 (---------------) + I ne 0x23a871c7, // n0x06bf c0x008e (n0x0b14-n0x0b36) + I niigata 0x23ec9384, // n0x06c0 c0x008f (n0x0b36-n0x0b49) + I oita 0x242611c7, // n0x06c1 c0x0090 (n0x0b49-n0x0b63) + I okayama 0x2470f2c7, // n0x06c2 c0x0091 (n0x0b63-n0x0b8d) + I okinawa 0x00204282, // n0x06c3 c0x0000 (---------------) + I or 0x24a80b85, // n0x06c4 c0x0092 (n0x0b8d-n0x0bbf) + I osaka 0x24e59b04, // n0x06c5 c0x0093 (n0x0bbf-n0x0bd9) + I saga 0x252a3b07, // n0x06c6 c0x0094 (n0x0bd9-n0x0c1e) + I saitama 0x256545c7, // n0x06c7 c0x0095 (n0x0c1e-n0x0c1f)* o I sapporo 0x25a68246, // n0x06c8 c0x0096 (n0x0c1f-n0x0c20)* o I sendai 0x25e652c5, // n0x06c9 c0x0097 (n0x0c20-n0x0c37) + I shiga 0x2627a787, // n0x06ca c0x0098 (n0x0c37-n0x0c4e) + I shimane 0x266d1e48, // n0x06cb c0x0099 (n0x0c4e-n0x0c72) + I shizuoka 0x26b2dfc7, // n0x06cc c0x009a (n0x0c72-n0x0c91) + I tochigi 0x26eccac9, // n0x06cd c0x009b (n0x0c91-n0x0ca2) + I tokushima 0x2721ec85, // n0x06ce c0x009c (n0x0ca2-n0x0cdb) + I tokyo 0x2771ddc7, // n0x06cf c0x009d (n0x0cdb-n0x0ce8) + I tottori 0x27a18dc6, // n0x06d0 c0x009e (n0x0ce8-n0x0d00) + I toyama 0x27e91608, // n0x06d1 c0x009f (n0x0d00-n0x0d1d) + I wakayama 0x28266548, // n0x06d2 c0x00a0 (n0x0d1d-n0x0d3f) + I yamagata 0x2866bb49, // n0x06d3 c0x00a1 (n0x0d3f-n0x0d4f) + I yamaguchi 0x28b30b49, // n0x06d4 c0x00a2 (n0x0d4f-n0x0d6b) + I yamanashi 0x28e24708, // n0x06d5 c0x00a3 (n0x0d6b-n0x0d6c)* o I yokohama 0x0029ce85, // n0x06d6 c0x0000 (---------------) + I aisai 0x0020b5c3, // n0x06d7 c0x0000 (---------------) + I ama 0x00248284, // n0x06d8 c0x0000 (---------------) + I anjo 0x0033e1c5, // n0x06d9 c0x0000 (---------------) + I asuke 0x002a0506, // n0x06da c0x0000 (---------------) + I chiryu 0x002a1ac5, // n0x06db c0x0000 (---------------) + I chita 0x0026b444, // n0x06dc c0x0000 (---------------) + I fuso 0x002b00c8, // n0x06dd c0x0000 (---------------) + I gamagori 0x002a3605, // n0x06de c0x0000 (---------------) + I handa 0x00277644, // n0x06df c0x0000 (---------------) + I hazu 0x00342947, // n0x06e0 c0x0000 (---------------) + I hekinan 0x00282cca, // n0x06e1 c0x0000 (---------------) + I higashiura 0x00206c8a, // n0x06e2 c0x0000 (---------------) + I ichinomiya 0x002d7587, // n0x06e3 c0x0000 (---------------) + I inazawa 0x0025de87, // n0x06e4 c0x0000 (---------------) + I inuyama 0x003361c7, // n0x06e5 c0x0000 (---------------) + I isshiki 0x002eba47, // n0x06e6 c0x0000 (---------------) + I iwakura 0x002ce8c5, // n0x06e7 c0x0000 (---------------) + I kanie 0x002f8206, // n0x06e8 c0x0000 (---------------) + I kariya 0x0027cc87, // n0x06e9 c0x0000 (---------------) + I kasugai 0x00249884, // n0x06ea c0x0000 (---------------) + I kira 0x00217906, // n0x06eb c0x0000 (---------------) + I kiyosu 0x002ad246, // n0x06ec c0x0000 (---------------) + I komaki 0x002d9945, // n0x06ed c0x0000 (---------------) + I konan 0x002e7b84, // n0x06ee c0x0000 (---------------) + I kota 0x00287e06, // n0x06ef c0x0000 (---------------) + I mihama 0x00281bc7, // n0x06f0 c0x0000 (---------------) + I miyoshi 0x00344848, // n0x06f1 c0x0000 (---------------) + I nagakute 0x002294c6, // n0x06f2 c0x0000 (---------------) + I nishio 0x0022f887, // n0x06f3 c0x0000 (---------------) + I nisshin 0x00277483, // n0x06f4 c0x0000 (---------------) + I obu 0x0022c706, // n0x06f5 c0x0000 (---------------) + I oguchi 0x002a0685, // n0x06f6 c0x0000 (---------------) + I oharu 0x00264cc7, // n0x06f7 c0x0000 (---------------) + I okazaki 0x002a5d4a, // n0x06f8 c0x0000 (---------------) + I owariasahi 0x0023e184, // n0x06f9 c0x0000 (---------------) + I seto 0x0028a108, // n0x06fa c0x0000 (---------------) + I shikatsu 0x002cc789, // n0x06fb c0x0000 (---------------) + I shinshiro 0x002d0f07, // n0x06fc c0x0000 (---------------) + I shitara 0x00235ec6, // n0x06fd c0x0000 (---------------) + I tahara 0x00287308, // n0x06fe c0x0000 (---------------) + I takahama 0x00279309, // n0x06ff c0x0000 (---------------) + I tobishima 0x002a9904, // n0x0700 c0x0000 (---------------) + I toei 0x00258204, // n0x0701 c0x0000 (---------------) + I togo 0x002e4345, // n0x0702 c0x0000 (---------------) + I tokai 0x002d15c8, // n0x0703 c0x0000 (---------------) + I tokoname 0x002ab587, // n0x0704 c0x0000 (---------------) + I toyoake 0x002ca649, // n0x0705 c0x0000 (---------------) + I toyohashi 0x002519c8, // n0x0706 c0x0000 (---------------) + I toyokawa 0x002585c6, // n0x0707 c0x0000 (---------------) + I toyone 0x0026fc46, // n0x0708 c0x0000 (---------------) + I toyota 0x0027dc48, // n0x0709 c0x0000 (---------------) + I tsushima 0x00313486, // n0x070a c0x0000 (---------------) + I yatomi 0x0023a905, // n0x070b c0x0000 (---------------) + I akita 0x00268306, // n0x070c c0x0000 (---------------) + I daisen 0x002617c8, // n0x070d c0x0000 (---------------) + I fujisato 0x002e2806, // n0x070e c0x0000 (---------------) + I gojome 0x002ac68b, // n0x070f c0x0000 (---------------) + I hachirogata 0x00272606, // n0x0710 c0x0000 (---------------) + I happou 0x0027ef8d, // n0x0711 c0x0000 (---------------) + I higashinaruse 0x0020edc5, // n0x0712 c0x0000 (---------------) + I honjo 0x0028a8c6, // n0x0713 c0x0000 (---------------) + I honjyo 0x00260705, // n0x0714 c0x0000 (---------------) + I ikawa 0x00313c09, // n0x0715 c0x0000 (---------------) + I kamikoani 0x0024d347, // n0x0716 c0x0000 (---------------) + I kamioka 0x002a7848, // n0x0717 c0x0000 (---------------) + I katagami 0x002332c6, // n0x0718 c0x0000 (---------------) + I kazuno 0x0027e3c9, // n0x0719 c0x0000 (---------------) + I kitaakita 0x00290dc6, // n0x071a c0x0000 (---------------) + I kosaka 0x002a5cc5, // n0x071b c0x0000 (---------------) + I kyowa 0x00279206, // n0x071c c0x0000 (---------------) + I misato 0x00256606, // n0x071d c0x0000 (---------------) + I mitane 0x002afa09, // n0x071e c0x0000 (---------------) + I moriyoshi 0x002a9706, // n0x071f c0x0000 (---------------) + I nikaho 0x002504c7, // n0x0720 c0x0000 (---------------) + I noshiro 0x002509c5, // n0x0721 c0x0000 (---------------) + I odate 0x00205783, // n0x0722 c0x0000 (---------------) + I oga 0x002a0085, // n0x0723 c0x0000 (---------------) + I ogata 0x00218b07, // n0x0724 c0x0000 (---------------) + I semboku 0x002a6a86, // n0x0725 c0x0000 (---------------) + I yokote 0x0020ecc9, // n0x0726 c0x0000 (---------------) + I yurihonjo 0x002f9546, // n0x0727 c0x0000 (---------------) + I aomori 0x00304e86, // n0x0728 c0x0000 (---------------) + I gonohe 0x00255c09, // n0x0729 c0x0000 (---------------) + I hachinohe 0x00267d09, // n0x072a c0x0000 (---------------) + I hashikami 0x00285487, // n0x072b c0x0000 (---------------) + I hiranai 0x002a7bc8, // n0x072c c0x0000 (---------------) + I hirosaki 0x00325e89, // n0x072d c0x0000 (---------------) + I itayanagi 0x00265188, // n0x072e c0x0000 (---------------) + I kuroishi 0x002bed86, // n0x072f c0x0000 (---------------) + I misawa 0x002b9b85, // n0x0730 c0x0000 (---------------) + I mutsu 0x0021ca0a, // n0x0731 c0x0000 (---------------) + I nakadomari 0x00304f06, // n0x0732 c0x0000 (---------------) + I noheji 0x002e9fc6, // n0x0733 c0x0000 (---------------) + I oirase 0x00287105, // n0x0734 c0x0000 (---------------) + I owani 0x0021a408, // n0x0735 c0x0000 (---------------) + I rokunohe 0x0024ec47, // n0x0736 c0x0000 (---------------) + I sannohe 0x0034274a, // n0x0737 c0x0000 (---------------) + I shichinohe 0x0022f946, // n0x0738 c0x0000 (---------------) + I shingo 0x002fcd85, // n0x0739 c0x0000 (---------------) + I takko 0x002d2c86, // n0x073a c0x0000 (---------------) + I towada 0x00294647, // n0x073b c0x0000 (---------------) + I tsugaru 0x00235d87, // n0x073c c0x0000 (---------------) + I tsuruta 0x0022b385, // n0x073d c0x0000 (---------------) + I abiko 0x002a5e85, // n0x073e c0x0000 (---------------) + I asahi 0x00304d06, // n0x073f c0x0000 (---------------) + I chonan 0x00306d86, // n0x0740 c0x0000 (---------------) + I chosei 0x0030a206, // n0x0741 c0x0000 (---------------) + I choshi 0x002f8704, // n0x0742 c0x0000 (---------------) + I chuo 0x00266b09, // n0x0743 c0x0000 (---------------) + I funabashi 0x0026ca06, // n0x0744 c0x0000 (---------------) + I futtsu 0x002474ca, // n0x0745 c0x0000 (---------------) + I hanamigawa 0x002766c8, // n0x0746 c0x0000 (---------------) + I ichihara 0x00279008, // n0x0747 c0x0000 (---------------) + I ichikawa 0x00206c8a, // n0x0748 c0x0000 (---------------) + I ichinomiya 0x002ea585, // n0x0749 c0x0000 (---------------) + I inzai 0x00281b05, // n0x074a c0x0000 (---------------) + I isumi 0x002b5308, // n0x074b c0x0000 (---------------) + I kamagaya 0x002d4ac8, // n0x074c c0x0000 (---------------) + I kamogawa 0x00215d07, // n0x074d c0x0000 (---------------) + I kashiwa 0x002d18c6, // n0x074e c0x0000 (---------------) + I katori 0x002f0008, // n0x074f c0x0000 (---------------) + I katsuura 0x002d8bc7, // n0x0750 c0x0000 (---------------) + I kimitsu 0x002660c8, // n0x0751 c0x0000 (---------------) + I kisarazu 0x00297dc6, // n0x0752 c0x0000 (---------------) + I kozaki 0x00330f88, // n0x0753 c0x0000 (---------------) + I kujukuri 0x00234046, // n0x0754 c0x0000 (---------------) + I kyonan 0x0021a087, // n0x0755 c0x0000 (---------------) + I matsudo 0x002667c6, // n0x0756 c0x0000 (---------------) + I midori 0x00287e06, // n0x0757 c0x0000 (---------------) + I mihama 0x0031358a, // n0x0758 c0x0000 (---------------) + I minamiboso 0x002c6006, // n0x0759 c0x0000 (---------------) + I mobara 0x002b9b89, // n0x075a c0x0000 (---------------) + I mutsuzawa 0x0028dd46, // n0x075b c0x0000 (---------------) + I nagara 0x0028df8a, // n0x075c c0x0000 (---------------) + I nagareyama 0x00334489, // n0x075d c0x0000 (---------------) + I narashino 0x00335e46, // n0x075e c0x0000 (---------------) + I narita 0x00345804, // n0x075f c0x0000 (---------------) + I noda 0x0020d44d, // n0x0760 c0x0000 (---------------) + I oamishirasato 0x0026bdc7, // n0x0761 c0x0000 (---------------) + I omigawa 0x002f2e86, // n0x0762 c0x0000 (---------------) + I onjuku 0x002a0905, // n0x0763 c0x0000 (---------------) + I otaki 0x00290e45, // n0x0764 c0x0000 (---------------) + I sakae 0x002a2746, // n0x0765 c0x0000 (---------------) + I sakura 0x002d1349, // n0x0766 c0x0000 (---------------) + I shimofusa 0x002ce447, // n0x0767 c0x0000 (---------------) + I shirako 0x00262206, // n0x0768 c0x0000 (---------------) + I shiroi 0x002d09c6, // n0x0769 c0x0000 (---------------) + I shisui 0x002ebe09, // n0x076a c0x0000 (---------------) + I sodegaura 0x0023a844, // n0x076b c0x0000 (---------------) + I sosa 0x0026ac84, // n0x076c c0x0000 (---------------) + I tako 0x00231e48, // n0x076d c0x0000 (---------------) + I tateyama 0x002c1d46, // n0x076e c0x0000 (---------------) + I togane 0x002e8088, // n0x076f c0x0000 (---------------) + I tohnosho 0x002f1c08, // n0x0770 c0x0000 (---------------) + I tomisato 0x0025e607, // n0x0771 c0x0000 (---------------) + I urayasu 0x00285b09, // n0x0772 c0x0000 (---------------) + I yachimata 0x00202887, // n0x0773 c0x0000 (---------------) + I yachiyo 0x0029c04a, // n0x0774 c0x0000 (---------------) + I yokaichiba 0x002d658f, // n0x0775 c0x0000 (---------------) + I yokoshibahikari 0x0027a24a, // n0x0776 c0x0000 (---------------) + I yotsukaido 0x00221605, // n0x0777 c0x0000 (---------------) + I ainan 0x00261a05, // n0x0778 c0x0000 (---------------) + I honai 0x0027cb45, // n0x0779 c0x0000 (---------------) + I ikata 0x002342c7, // n0x077a c0x0000 (---------------) + I imabari 0x00202983, // n0x077b c0x0000 (---------------) + I iyo 0x002a7dc8, // n0x077c c0x0000 (---------------) + I kamijima 0x00205c46, // n0x077d c0x0000 (---------------) + I kihoku 0x00205d49, // n0x077e c0x0000 (---------------) + I kumakogen 0x002e3e86, // n0x077f c0x0000 (---------------) + I masaki 0x0029bcc7, // n0x0780 c0x0000 (---------------) + I matsuno 0x0027e189, // n0x0781 c0x0000 (---------------) + I matsuyama 0x002a7748, // n0x0782 c0x0000 (---------------) + I namikata 0x00313dc7, // n0x0783 c0x0000 (---------------) + I niihama 0x002fc943, // n0x0784 c0x0000 (---------------) + I ozu 0x0029cf05, // n0x0785 c0x0000 (---------------) + I saijo 0x002d64c5, // n0x0786 c0x0000 (---------------) + I seiyo 0x002f854b, // n0x0787 c0x0000 (---------------) + I shikokuchuo 0x0024f3c4, // n0x0788 c0x0000 (---------------) + I tobe 0x002da904, // n0x0789 c0x0000 (---------------) + I toon 0x00260886, // n0x078a c0x0000 (---------------) + I uchiko 0x0029db87, // n0x078b c0x0000 (---------------) + I uwajima 0x0032f20a, // n0x078c c0x0000 (---------------) + I yawatahama 0x00307807, // n0x078d c0x0000 (---------------) + I echizen 0x00293987, // n0x078e c0x0000 (---------------) + I eiheiji 0x00264585, // n0x078f c0x0000 (---------------) + I fukui 0x00205505, // n0x0790 c0x0000 (---------------) + I ikeda 0x0031d449, // n0x0791 c0x0000 (---------------) + I katsuyama 0x00287e06, // n0x0792 c0x0000 (---------------) + I mihama 0x0030768d, // n0x0793 c0x0000 (---------------) + I minamiechizen 0x0030f685, // n0x0794 c0x0000 (---------------) + I obama 0x0027a483, // n0x0795 c0x0000 (---------------) + I ohi 0x00206b83, // n0x0796 c0x0000 (---------------) + I ono 0x00225105, // n0x0797 c0x0000 (---------------) + I sabae 0x00306345, // n0x0798 c0x0000 (---------------) + I sakai 0x00287308, // n0x0799 c0x0000 (---------------) + I takahama 0x003186c7, // n0x079a c0x0000 (---------------) + I tsuruga 0x0026aa06, // n0x079b c0x0000 (---------------) + I wakasa 0x002833c6, // n0x079c c0x0000 (---------------) + I ashiya 0x0028fe05, // n0x079d c0x0000 (---------------) + I buzen 0x00319ac7, // n0x079e c0x0000 (---------------) + I chikugo 0x0025e107, // n0x079f c0x0000 (---------------) + I chikuho 0x00207047, // n0x07a0 c0x0000 (---------------) + I chikujo 0x0024f6ca, // n0x07a1 c0x0000 (---------------) + I chikushino 0x0022c7c8, // n0x07a2 c0x0000 (---------------) + I chikuzen 0x002f8704, // n0x07a3 c0x0000 (---------------) + I chuo 0x0026a247, // n0x07a4 c0x0000 (---------------) + I dazaifu 0x00263707, // n0x07a5 c0x0000 (---------------) + I fukuchi 0x0032d486, // n0x07a6 c0x0000 (---------------) + I hakata 0x00278307, // n0x07a7 c0x0000 (---------------) + I higashi 0x00269bc8, // n0x07a8 c0x0000 (---------------) + I hirokawa 0x00330a48, // n0x07a9 c0x0000 (---------------) + I hisayama 0x0023cf06, // n0x07aa c0x0000 (---------------) + I iizuka 0x002eabc8, // n0x07ab c0x0000 (---------------) + I inatsuki 0x00256d44, // n0x07ac c0x0000 (---------------) + I kaho 0x0027cc86, // n0x07ad c0x0000 (---------------) + I kasuga 0x0021d086, // n0x07ae c0x0000 (---------------) + I kasuya 0x002cfbc6, // n0x07af c0x0000 (---------------) + I kawara 0x002926c6, // n0x07b0 c0x0000 (---------------) + I keisen 0x00283944, // n0x07b1 c0x0000 (---------------) + I koga 0x002ebb06, // n0x07b2 c0x0000 (---------------) + I kurate 0x0029ef86, // n0x07b3 c0x0000 (---------------) + I kurogi 0x0027d346, // n0x07b4 c0x0000 (---------------) + I kurume 0x0020aa46, // n0x07b5 c0x0000 (---------------) + I minami 0x00215746, // n0x07b6 c0x0000 (---------------) + I miyako 0x00269a06, // n0x07b7 c0x0000 (---------------) + I miyama 0x0026a908, // n0x07b8 c0x0000 (---------------) + I miyawaka 0x00293208, // n0x07b9 c0x0000 (---------------) + I mizumaki 0x002b4048, // n0x07ba c0x0000 (---------------) + I munakata 0x002a1cc8, // n0x07bb c0x0000 (---------------) + I nakagawa 0x002b5286, // n0x07bc c0x0000 (---------------) + I nakama 0x00201005, // n0x07bd c0x0000 (---------------) + I nishi 0x002a0046, // n0x07be c0x0000 (---------------) + I nogata 0x002bd105, // n0x07bf c0x0000 (---------------) + I ogori 0x00249747, // n0x07c0 c0x0000 (---------------) + I okagaki 0x00200ec5, // n0x07c1 c0x0000 (---------------) + I okawa 0x002d5143, // n0x07c2 c0x0000 (---------------) + I oki 0x00212385, // n0x07c3 c0x0000 (---------------) + I omuta 0x00333604, // n0x07c4 c0x0000 (---------------) + I onga 0x00215885, // n0x07c5 c0x0000 (---------------) + I onojo 0x0020a7c3, // n0x07c6 c0x0000 (---------------) + I oto 0x00290c07, // n0x07c7 c0x0000 (---------------) + I saigawa 0x002ba5c8, // n0x07c8 c0x0000 (---------------) + I sasaguri 0x002c8bc6, // n0x07c9 c0x0000 (---------------) + I shingu 0x002cd10d, // n0x07ca c0x0000 (---------------) + I shinyoshitomi 0x002619c6, // n0x07cb c0x0000 (---------------) + I shonai 0x0027b7c5, // n0x07cc c0x0000 (---------------) + I soeda 0x002b2e03, // n0x07cd c0x0000 (---------------) + I sue 0x0029ccc9, // n0x07ce c0x0000 (---------------) + I tachiarai 0x002acc86, // n0x07cf c0x0000 (---------------) + I tagawa 0x00204e46, // n0x07d0 c0x0000 (---------------) + I takata 0x00294b44, // n0x07d1 c0x0000 (---------------) + I toho 0x0027a1c7, // n0x07d2 c0x0000 (---------------) + I toyotsu 0x00235b06, // n0x07d3 c0x0000 (---------------) + I tsuiki 0x00265645, // n0x07d4 c0x0000 (---------------) + I ukiha 0x00217a43, // n0x07d5 c0x0000 (---------------) + I umi 0x002189c4, // n0x07d6 c0x0000 (---------------) + I usui 0x002638c6, // n0x07d7 c0x0000 (---------------) + I yamada 0x002f8304, // n0x07d8 c0x0000 (---------------) + I yame 0x0021d188, // n0x07d9 c0x0000 (---------------) + I yanagawa 0x0020e489, // n0x07da c0x0000 (---------------) + I yukuhashi 0x00201149, // n0x07db c0x0000 (---------------) + I aizubange 0x0028478a, // n0x07dc c0x0000 (---------------) + I aizumisato 0x0028ee0d, // n0x07dd c0x0000 (---------------) + I aizuwakamatsu 0x002b4f07, // n0x07de c0x0000 (---------------) + I asakawa 0x0030c9c6, // n0x07df c0x0000 (---------------) + I bandai 0x00250a04, // n0x07e0 c0x0000 (---------------) + I date 0x00227489, // n0x07e1 c0x0000 (---------------) + I fukushima 0x0026ae48, // n0x07e2 c0x0000 (---------------) + I furudono 0x0026b9c6, // n0x07e3 c0x0000 (---------------) + I futaba 0x00243d86, // n0x07e4 c0x0000 (---------------) + I hanawa 0x00278307, // n0x07e5 c0x0000 (---------------) + I higashi 0x002cfd86, // n0x07e6 c0x0000 (---------------) + I hirata 0x00226786, // n0x07e7 c0x0000 (---------------) + I hirono 0x003424c6, // n0x07e8 c0x0000 (---------------) + I iitate 0x0030f34a, // n0x07e9 c0x0000 (---------------) + I inawashiro 0x002a2c88, // n0x07ea c0x0000 (---------------) + I ishikawa 0x0022ca85, // n0x07eb c0x0000 (---------------) + I iwaki 0x002b3609, // n0x07ec c0x0000 (---------------) + I izumizaki 0x002cc18a, // n0x07ed c0x0000 (---------------) + I kagamiishi 0x002cd488, // n0x07ee c0x0000 (---------------) + I kaneyama 0x00281588, // n0x07ef c0x0000 (---------------) + I kawamata 0x00298a08, // n0x07f0 c0x0000 (---------------) + I kitakata 0x0028300c, // n0x07f1 c0x0000 (---------------) + I kitashiobara 0x002f3845, // n0x07f2 c0x0000 (---------------) + I koori 0x00283648, // n0x07f3 c0x0000 (---------------) + I koriyama 0x002ad4c6, // n0x07f4 c0x0000 (---------------) + I kunimi 0x00336586, // n0x07f5 c0x0000 (---------------) + I miharu 0x002d6fc7, // n0x07f6 c0x0000 (---------------) + I mishima 0x00307705, // n0x07f7 c0x0000 (---------------) + I namie 0x00304dc5, // n0x07f8 c0x0000 (---------------) + I nango 0x00201009, // n0x07f9 c0x0000 (---------------) + I nishiaizu 0x00225907, // n0x07fa c0x0000 (---------------) + I nishigo 0x00205d05, // n0x07fb c0x0000 (---------------) + I okuma 0x00227107, // n0x07fc c0x0000 (---------------) + I omotego 0x00206b83, // n0x07fd c0x0000 (---------------) + I ono 0x002abac5, // n0x07fe c0x0000 (---------------) + I otama 0x0023ff88, // n0x07ff c0x0000 (---------------) + I samegawa 0x00329807, // n0x0800 c0x0000 (---------------) + I shimogo 0x00281449, // n0x0801 c0x0000 (---------------) + I shirakawa 0x002d3145, // n0x0802 c0x0000 (---------------) + I showa 0x002d4444, // n0x0803 c0x0000 (---------------) + I soma 0x00286288, // n0x0804 c0x0000 (---------------) + I sukagawa 0x00200547, // n0x0805 c0x0000 (---------------) + I taishin 0x00313f88, // n0x0806 c0x0000 (---------------) + I tamakawa 0x002827c8, // n0x0807 c0x0000 (---------------) + I tanagura 0x0020c985, // n0x0808 c0x0000 (---------------) + I tenei 0x002fc686, // n0x0809 c0x0000 (---------------) + I yabuki 0x0024d686, // n0x080a c0x0000 (---------------) + I yamato 0x0020b589, // n0x080b c0x0000 (---------------) + I yamatsuri 0x002cdd47, // n0x080c c0x0000 (---------------) + I yanaizu 0x0028e586, // n0x080d c0x0000 (---------------) + I yugawa 0x0031c547, // n0x080e c0x0000 (---------------) + I anpachi 0x00205943, // n0x080f c0x0000 (---------------) + I ena 0x0032e104, // n0x0810 c0x0000 (---------------) + I gifu 0x0021fb05, // n0x0811 c0x0000 (---------------) + I ginan 0x0026a4c4, // n0x0812 c0x0000 (---------------) + I godo 0x002c8cc4, // n0x0813 c0x0000 (---------------) + I gujo 0x002ac9c7, // n0x0814 c0x0000 (---------------) + I hashima 0x0024ddc7, // n0x0815 c0x0000 (---------------) + I hichiso 0x002623c4, // n0x0816 c0x0000 (---------------) + I hida 0x00281290, // n0x0817 c0x0000 (---------------) + I higashishirakawa 0x002a6d47, // n0x0818 c0x0000 (---------------) + I ibigawa 0x00205505, // n0x0819 c0x0000 (---------------) + I ikeda 0x0032e38c, // n0x081a c0x0000 (---------------) + I kakamigahara 0x00203404, // n0x081b c0x0000 (---------------) + I kani 0x002ccf08, // n0x081c c0x0000 (---------------) + I kasahara 0x00219f89, // n0x081d c0x0000 (---------------) + I kasamatsu 0x00318cc6, // n0x081e c0x0000 (---------------) + I kawaue 0x0023a948, // n0x081f c0x0000 (---------------) + I kitagata 0x00200e04, // n0x0820 c0x0000 (---------------) + I mino 0x002dbb88, // n0x0821 c0x0000 (---------------) + I minokamo 0x002aab06, // n0x0822 c0x0000 (---------------) + I mitake 0x0022a2c8, // n0x0823 c0x0000 (---------------) + I mizunami 0x0027be46, // n0x0824 c0x0000 (---------------) + I motosu 0x002fe58b, // n0x0825 c0x0000 (---------------) + I nakatsugawa 0x00205785, // n0x0826 c0x0000 (---------------) + I ogaki 0x00256cc8, // n0x0827 c0x0000 (---------------) + I sakahogi 0x0020e8c4, // n0x0828 c0x0000 (---------------) + I seki 0x0020e8ca, // n0x0829 c0x0000 (---------------) + I sekigahara 0x00281449, // n0x082a c0x0000 (---------------) + I shirakawa 0x002666c6, // n0x082b c0x0000 (---------------) + I tajimi 0x002d6ac8, // n0x082c c0x0000 (---------------) + I takayama 0x0023e585, // n0x082d c0x0000 (---------------) + I tarui 0x002fb744, // n0x082e c0x0000 (---------------) + I toki 0x002cce06, // n0x082f c0x0000 (---------------) + I tomika 0x0024f588, // n0x0830 c0x0000 (---------------) + I wanouchi 0x00266548, // n0x0831 c0x0000 (---------------) + I yamagata 0x002e8906, // n0x0832 c0x0000 (---------------) + I yaotsu 0x002122c4, // n0x0833 c0x0000 (---------------) + I yoro 0x0021c986, // n0x0834 c0x0000 (---------------) + I annaka 0x00202907, // n0x0835 c0x0000 (---------------) + I chiyoda 0x002610c7, // n0x0836 c0x0000 (---------------) + I fujioka 0x002b31cf, // n0x0837 c0x0000 (---------------) + I higashiagatsuma 0x002ec8c7, // n0x0838 c0x0000 (---------------) + I isesaki 0x00335f07, // n0x0839 c0x0000 (---------------) + I itakura 0x002d1fc5, // n0x083a c0x0000 (---------------) + I kanna 0x00261dc5, // n0x083b c0x0000 (---------------) + I kanra 0x00285149, // n0x083c c0x0000 (---------------) + I katashina 0x00279c06, // n0x083d c0x0000 (---------------) + I kawaba 0x00265405, // n0x083e c0x0000 (---------------) + I kiryu 0x00268007, // n0x083f c0x0000 (---------------) + I kusatsu 0x00297408, // n0x0840 c0x0000 (---------------) + I maebashi 0x002f8385, // n0x0841 c0x0000 (---------------) + I meiwa 0x002667c6, // n0x0842 c0x0000 (---------------) + I midori 0x00229b88, // n0x0843 c0x0000 (---------------) + I minakami 0x0030f04a, // n0x0844 c0x0000 (---------------) + I naganohara 0x0023ecc8, // n0x0845 c0x0000 (---------------) + I nakanojo 0x00270847, // n0x0846 c0x0000 (---------------) + I nanmoku 0x002d69c6, // n0x0847 c0x0000 (---------------) + I numata 0x002b35c6, // n0x0848 c0x0000 (---------------) + I oizumi 0x00225e03, // n0x0849 c0x0000 (---------------) + I ora 0x00213103, // n0x084a c0x0000 (---------------) + I ota 0x0030a2c9, // n0x084b c0x0000 (---------------) + I shibukawa 0x00325d09, // n0x084c c0x0000 (---------------) + I shimonita 0x002cc9c6, // n0x084d c0x0000 (---------------) + I shinto 0x002d3145, // n0x084e c0x0000 (---------------) + I showa 0x002eae48, // n0x084f c0x0000 (---------------) + I takasaki 0x002d6ac8, // n0x0850 c0x0000 (---------------) + I takayama 0x002b83c8, // n0x0851 c0x0000 (---------------) + I tamamura 0x0034254b, // n0x0852 c0x0000 (---------------) + I tatebayashi 0x002cd347, // n0x0853 c0x0000 (---------------) + I tomioka 0x0028fa89, // n0x0854 c0x0000 (---------------) + I tsukiyono 0x002b3448, // n0x0855 c0x0000 (---------------) + I tsumagoi 0x00243604, // n0x0856 c0x0000 (---------------) + I ueno 0x002afb08, // n0x0857 c0x0000 (---------------) + I yoshioka 0x00273789, // n0x0858 c0x0000 (---------------) + I asaminami 0x0030ca85, // n0x0859 c0x0000 (---------------) + I daiwa 0x0023a407, // n0x085a c0x0000 (---------------) + I etajima 0x0032e185, // n0x085b c0x0000 (---------------) + I fuchu 0x00266448, // n0x085c c0x0000 (---------------) + I fukuyama 0x0027650b, // n0x085d c0x0000 (---------------) + I hatsukaichi 0x0027a4d0, // n0x085e c0x0000 (---------------) + I higashihiroshima 0x0028a6c5, // n0x085f c0x0000 (---------------) + I hongo 0x00212c8c, // n0x0860 c0x0000 (---------------) + I jinsekikogen 0x0026abc5, // n0x0861 c0x0000 (---------------) + I kaita 0x00264603, // n0x0862 c0x0000 (---------------) + I kui 0x002ca246, // n0x0863 c0x0000 (---------------) + I kumano 0x0029e404, // n0x0864 c0x0000 (---------------) + I kure 0x0025bf06, // n0x0865 c0x0000 (---------------) + I mihara 0x00281bc7, // n0x0866 c0x0000 (---------------) + I miyoshi 0x0020ff84, // n0x0867 c0x0000 (---------------) + I naka 0x00206b88, // n0x0868 c0x0000 (---------------) + I onomichi 0x002a7c8d, // n0x0869 c0x0000 (---------------) + I osakikamijima 0x0029b345, // n0x086a c0x0000 (---------------) + I otake 0x00256cc4, // n0x086b c0x0000 (---------------) + I saka 0x00221344, // n0x086c c0x0000 (---------------) + I sera 0x0028d5c9, // n0x086d c0x0000 (---------------) + I seranishi 0x002c8f08, // n0x086e c0x0000 (---------------) + I shinichi 0x002ea6c7, // n0x086f c0x0000 (---------------) + I shobara 0x002aab88, // n0x0870 c0x0000 (---------------) + I takehara 0x00266bc8, // n0x0871 c0x0000 (---------------) + I abashiri 0x00262505, // n0x0872 c0x0000 (---------------) + I abira 0x00345047, // n0x0873 c0x0000 (---------------) + I aibetsu 0x00262487, // n0x0874 c0x0000 (---------------) + I akabira 0x00206007, // n0x0875 c0x0000 (---------------) + I akkeshi 0x002a5e89, // n0x0876 c0x0000 (---------------) + I asahikawa 0x00235989, // n0x0877 c0x0000 (---------------) + I ashibetsu 0x0023af46, // n0x0878 c0x0000 (---------------) + I ashoro 0x002720c6, // n0x0879 c0x0000 (---------------) + I assabu 0x002680c6, // n0x087a c0x0000 (---------------) + I atsuma 0x00288b45, // n0x087b c0x0000 (---------------) + I bibai 0x002f4884, // n0x087c c0x0000 (---------------) + I biei 0x00204746, // n0x087d c0x0000 (---------------) + I bifuka 0x00205086, // n0x087e c0x0000 (---------------) + I bihoro 0x00262548, // n0x087f c0x0000 (---------------) + I biratori 0x0029430b, // n0x0880 c0x0000 (---------------) + I chippubetsu 0x002c18c7, // n0x0881 c0x0000 (---------------) + I chitose 0x00250a04, // n0x0882 c0x0000 (---------------) + I date 0x002bf5c6, // n0x0883 c0x0000 (---------------) + I ebetsu 0x002dc347, // n0x0884 c0x0000 (---------------) + I embetsu 0x002b7305, // n0x0885 c0x0000 (---------------) + I eniwa 0x00291b45, // n0x0886 c0x0000 (---------------) + I erimo 0x00248204, // n0x0887 c0x0000 (---------------) + I esan 0x00235906, // n0x0888 c0x0000 (---------------) + I esashi 0x002047c8, // n0x0889 c0x0000 (---------------) + I fukagawa 0x00227489, // n0x088a c0x0000 (---------------) + I fukushima 0x00253d06, // n0x088b c0x0000 (---------------) + I furano 0x00269588, // n0x088c c0x0000 (---------------) + I furubira 0x00238ec6, // n0x088d c0x0000 (---------------) + I haboro 0x00330248, // n0x088e c0x0000 (---------------) + I hakodate 0x002ce04c, // n0x088f c0x0000 (---------------) + I hamatonbetsu 0x002623c6, // n0x0890 c0x0000 (---------------) + I hidaka 0x0027b48d, // n0x0891 c0x0000 (---------------) + I higashikagura 0x0027b90b, // n0x0892 c0x0000 (---------------) + I higashikawa 0x00250585, // n0x0893 c0x0000 (---------------) + I hiroo 0x0025e247, // n0x0894 c0x0000 (---------------) + I hokuryu 0x002a9806, // n0x0895 c0x0000 (---------------) + I hokuto 0x002a87c8, // n0x0896 c0x0000 (---------------) + I honbetsu 0x0023afc9, // n0x0897 c0x0000 (---------------) + I horokanai 0x003139c8, // n0x0898 c0x0000 (---------------) + I horonobe 0x00205505, // n0x0899 c0x0000 (---------------) + I ikeda 0x0023a507, // n0x089a c0x0000 (---------------) + I imakane 0x002cc308, // n0x089b c0x0000 (---------------) + I ishikari 0x002b6a09, // n0x089c c0x0000 (---------------) + I iwamizawa 0x0025f106, // n0x089d c0x0000 (---------------) + I iwanai 0x00253c0a, // n0x089e c0x0000 (---------------) + I kamifurano 0x002a8548, // n0x089f c0x0000 (---------------) + I kamikawa 0x0031380b, // n0x08a0 c0x0000 (---------------) + I kamishihoro 0x0023d00c, // n0x08a1 c0x0000 (---------------) + I kamisunagawa 0x002dbc88, // n0x08a2 c0x0000 (---------------) + I kamoenai 0x00263046, // n0x08a3 c0x0000 (---------------) + I kayabe 0x00206f08, // n0x08a4 c0x0000 (---------------) + I kembuchi 0x002e9e07, // n0x08a5 c0x0000 (---------------) + I kikonai 0x00235c09, // n0x08a6 c0x0000 (---------------) + I kimobetsu 0x0027424d, // n0x08a7 c0x0000 (---------------) + I kitahiroshima 0x0027acc6, // n0x08a8 c0x0000 (---------------) + I kitami 0x002949c8, // n0x08a9 c0x0000 (---------------) + I kiyosato 0x002930c9, // n0x08aa c0x0000 (---------------) + I koshimizu 0x0029d9c8, // n0x08ab c0x0000 (---------------) + I kunneppu 0x00331088, // n0x08ac c0x0000 (---------------) + I kuriyama 0x0029f90c, // n0x08ad c0x0000 (---------------) + I kuromatsunai 0x002a1447, // n0x08ae c0x0000 (---------------) + I kushiro 0x002a3507, // n0x08af c0x0000 (---------------) + I kutchan 0x002a5cc5, // n0x08b0 c0x0000 (---------------) + I kyowa 0x00314207, // n0x08b1 c0x0000 (---------------) + I mashike 0x002972c8, // n0x08b2 c0x0000 (---------------) + I matsumae 0x002cce86, // n0x08b3 c0x0000 (---------------) + I mikasa 0x0033804c, // n0x08b4 c0x0000 (---------------) + I minamifurano 0x002abec8, // n0x08b5 c0x0000 (---------------) + I mombetsu 0x002b0a88, // n0x08b6 c0x0000 (---------------) + I moseushi 0x00204a86, // n0x08b7 c0x0000 (---------------) + I mukawa 0x00285787, // n0x08b8 c0x0000 (---------------) + I muroran 0x0023b144, // n0x08b9 c0x0000 (---------------) + I naie 0x002a1cc8, // n0x08ba c0x0000 (---------------) + I nakagawa 0x002b620c, // n0x08bb c0x0000 (---------------) + I nakasatsunai 0x0032ca0c, // n0x08bc c0x0000 (---------------) + I nakatombetsu 0x00221685, // n0x08bd c0x0000 (---------------) + I nanae 0x002a2f87, // n0x08be c0x0000 (---------------) + I nanporo 0x00212246, // n0x08bf c0x0000 (---------------) + I nayoro 0x00285706, // n0x08c0 c0x0000 (---------------) + I nemuro 0x00309c88, // n0x08c1 c0x0000 (---------------) + I niikappu 0x00205bc4, // n0x08c2 c0x0000 (---------------) + I niki 0x002294cb, // n0x08c3 c0x0000 (---------------) + I nishiokoppe 0x0029218b, // n0x08c4 c0x0000 (---------------) + I noboribetsu 0x002d69c6, // n0x08c5 c0x0000 (---------------) + I numata 0x002a7b07, // n0x08c6 c0x0000 (---------------) + I obihiro 0x0031a8c5, // n0x08c7 c0x0000 (---------------) + I obira 0x00258145, // n0x08c8 c0x0000 (---------------) + I oketo 0x00229606, // n0x08c9 c0x0000 (---------------) + I okoppe 0x0023e545, // n0x08ca c0x0000 (---------------) + I otaru 0x0024f385, // n0x08cb c0x0000 (---------------) + I otobe 0x00219047, // n0x08cc c0x0000 (---------------) + I otofuke 0x0020a7c9, // n0x08cd c0x0000 (---------------) + I otoineppu 0x00272704, // n0x08ce c0x0000 (---------------) + I oumu 0x002bfe85, // n0x08cf c0x0000 (---------------) + I ozora 0x002beb45, // n0x08d0 c0x0000 (---------------) + I pippu 0x00285888, // n0x08d1 c0x0000 (---------------) + I rankoshi 0x002069c5, // n0x08d2 c0x0000 (---------------) + I rebun 0x00248d09, // n0x08d3 c0x0000 (---------------) + I rikubetsu 0x002cd8c7, // n0x08d4 c0x0000 (---------------) + I rishiri 0x002cd8cb, // n0x08d5 c0x0000 (---------------) + I rishirifuji 0x002c5206, // n0x08d6 c0x0000 (---------------) + I saroma 0x0026a649, // n0x08d7 c0x0000 (---------------) + I sarufutsu 0x002e7ac8, // n0x08d8 c0x0000 (---------------) + I shakotan 0x002fdbc5, // n0x08d9 c0x0000 (---------------) + I shari 0x00206108, // n0x08da c0x0000 (---------------) + I shibecha 0x002359c8, // n0x08db c0x0000 (---------------) + I shibetsu 0x002d2947, // n0x08dc c0x0000 (---------------) + I shikabe 0x00297547, // n0x08dd c0x0000 (---------------) + I shikaoi 0x002aca49, // n0x08de c0x0000 (---------------) + I shimamaki 0x0022a207, // n0x08df c0x0000 (---------------) + I shimizu 0x00321349, // n0x08e0 c0x0000 (---------------) + I shimokawa 0x002cab8c, // n0x08e1 c0x0000 (---------------) + I shinshinotsu 0x002cc9c8, // n0x08e2 c0x0000 (---------------) + I shintoku 0x002ce709, // n0x08e3 c0x0000 (---------------) + I shiranuka 0x002ceac7, // n0x08e4 c0x0000 (---------------) + I shiraoi 0x00266c89, // n0x08e5 c0x0000 (---------------) + I shiriuchi 0x00202fc7, // n0x08e6 c0x0000 (---------------) + I sobetsu 0x0023d108, // n0x08e7 c0x0000 (---------------) + I sunagawa 0x002a0145, // n0x08e8 c0x0000 (---------------) + I taiki 0x0027cc06, // n0x08e9 c0x0000 (---------------) + I takasu 0x002a0948, // n0x08ea c0x0000 (---------------) + I takikawa 0x002f0f88, // n0x08eb c0x0000 (---------------) + I takinoue 0x002cc049, // n0x08ec c0x0000 (---------------) + I teshikaga 0x0024f3c7, // n0x08ed c0x0000 (---------------) + I tobetsu 0x00284985, // n0x08ee c0x0000 (---------------) + I tohma 0x002553c9, // n0x08ef c0x0000 (---------------) + I tomakomai 0x00253206, // n0x08f0 c0x0000 (---------------) + I tomari 0x00218dc4, // n0x08f1 c0x0000 (---------------) + I toya 0x0024d1c6, // n0x08f2 c0x0000 (---------------) + I toyako 0x002779c8, // n0x08f3 c0x0000 (---------------) + I toyotomi 0x0028b8c7, // n0x08f4 c0x0000 (---------------) + I toyoura 0x00294508, // n0x08f5 c0x0000 (---------------) + I tsubetsu 0x002eac89, // n0x08f6 c0x0000 (---------------) + I tsukigata 0x00228e47, // n0x08f7 c0x0000 (---------------) + I urakawa 0x00282e86, // n0x08f8 c0x0000 (---------------) + I urausu 0x0025e304, // n0x08f9 c0x0000 (---------------) + I uryu 0x00212409, // n0x08fa c0x0000 (---------------) + I utashinai 0x00344ec8, // n0x08fb c0x0000 (---------------) + I wakkanai 0x00204947, // n0x08fc c0x0000 (---------------) + I wassamu 0x00286586, // n0x08fd c0x0000 (---------------) + I yakumo 0x0028a9c6, // n0x08fe c0x0000 (---------------) + I yoichi 0x002e9f44, // n0x08ff c0x0000 (---------------) + I aioi 0x0029b4c6, // n0x0900 c0x0000 (---------------) + I akashi 0x00205e03, // n0x0901 c0x0000 (---------------) + I ako 0x002fa549, // n0x0902 c0x0000 (---------------) + I amagasaki 0x00205746, // n0x0903 c0x0000 (---------------) + I aogaki 0x0029f2c5, // n0x0904 c0x0000 (---------------) + I asago 0x002833c6, // n0x0905 c0x0000 (---------------) + I ashiya 0x0022a5c5, // n0x0906 c0x0000 (---------------) + I awaji 0x00265f48, // n0x0907 c0x0000 (---------------) + I fukusaki 0x002db9c7, // n0x0908 c0x0000 (---------------) + I goshiki 0x002eb886, // n0x0909 c0x0000 (---------------) + I harima 0x002a6c06, // n0x090a c0x0000 (---------------) + I himeji 0x00279008, // n0x090b c0x0000 (---------------) + I ichikawa 0x002852c7, // n0x090c c0x0000 (---------------) + I inagawa 0x0027ad05, // n0x090d c0x0000 (---------------) + I itami 0x002838c8, // n0x090e c0x0000 (---------------) + I kakogawa 0x0026f808, // n0x090f c0x0000 (---------------) + I kamigori 0x002a8548, // n0x0910 c0x0000 (---------------) + I kamikawa 0x0026aa85, // n0x0911 c0x0000 (---------------) + I kasai 0x0027cc86, // n0x0912 c0x0000 (---------------) + I kasuga 0x00200f09, // n0x0913 c0x0000 (---------------) + I kawanishi 0x0024d504, // n0x0914 c0x0000 (---------------) + I miki 0x0022a44b, // n0x0915 c0x0000 (---------------) + I minamiawaji 0x0022648b, // n0x0916 c0x0000 (---------------) + I nishinomiya 0x0022c989, // n0x0917 c0x0000 (---------------) + I nishiwaki 0x00206b83, // n0x0918 c0x0000 (---------------) + I ono 0x00246945, // n0x0919 c0x0000 (---------------) + I sanda 0x0024af46, // n0x091a c0x0000 (---------------) + I sannan 0x00272408, // n0x091b c0x0000 (---------------) + I sasayama 0x002cb9c4, // n0x091c c0x0000 (---------------) + I sayo 0x002c8bc6, // n0x091d c0x0000 (---------------) + I shingu 0x0024f809, // n0x091e c0x0000 (---------------) + I shinonsen 0x002d0745, // n0x091f c0x0000 (---------------) + I shiso 0x00218f86, // n0x0920 c0x0000 (---------------) + I sumoto 0x00200546, // n0x0921 c0x0000 (---------------) + I taishi 0x00204e44, // n0x0922 c0x0000 (---------------) + I taka 0x0020b20a, // n0x0923 c0x0000 (---------------) + I takarazuka 0x0029f208, // n0x0924 c0x0000 (---------------) + I takasago 0x002f0f86, // n0x0925 c0x0000 (---------------) + I takino 0x002bfc85, // n0x0926 c0x0000 (---------------) + I tamba 0x00234fc7, // n0x0927 c0x0000 (---------------) + I tatsuno 0x00261c87, // n0x0928 c0x0000 (---------------) + I toyooka 0x002fc684, // n0x0929 c0x0000 (---------------) + I yabu 0x002266c7, // n0x092a c0x0000 (---------------) + I yashiro 0x00251a44, // n0x092b c0x0000 (---------------) + I yoka 0x00251a46, // n0x092c c0x0000 (---------------) + I yokawa 0x00200dc3, // n0x092d c0x0000 (---------------) + I ami 0x002a5e85, // n0x092e c0x0000 (---------------) + I asahi 0x0032fc45, // n0x092f c0x0000 (---------------) + I bando 0x002b2fc8, // n0x0930 c0x0000 (---------------) + I chikusei 0x0026a405, // n0x0931 c0x0000 (---------------) + I daigo 0x00262109, // n0x0932 c0x0000 (---------------) + I fujishiro 0x00286d47, // n0x0933 c0x0000 (---------------) + I hitachi 0x002a1b0b, // n0x0934 c0x0000 (---------------) + I hitachinaka 0x00286d4c, // n0x0935 c0x0000 (---------------) + I hitachiomiya 0x0028778a, // n0x0936 c0x0000 (---------------) + I hitachiota 0x00329287, // n0x0937 c0x0000 (---------------) + I ibaraki 0x00208ac3, // n0x0938 c0x0000 (---------------) + I ina 0x002c9ac8, // n0x0939 c0x0000 (---------------) + I inashiki 0x0026ac45, // n0x093a c0x0000 (---------------) + I itako 0x002f8405, // n0x093b c0x0000 (---------------) + I iwama 0x0029cfc4, // n0x093c c0x0000 (---------------) + I joso 0x0023d006, // n0x093d c0x0000 (---------------) + I kamisu 0x00219f86, // n0x093e c0x0000 (---------------) + I kasama 0x0029b507, // n0x093f c0x0000 (---------------) + I kashima 0x0021be0b, // n0x0940 c0x0000 (---------------) + I kasumigaura 0x00283944, // n0x0941 c0x0000 (---------------) + I koga 0x002d2104, // n0x0942 c0x0000 (---------------) + I miho 0x002aad84, // n0x0943 c0x0000 (---------------) + I mito 0x002af246, // n0x0944 c0x0000 (---------------) + I moriya 0x0020ff84, // n0x0945 c0x0000 (---------------) + I naka 0x002d16c8, // n0x0946 c0x0000 (---------------) + I namegata 0x00303145, // n0x0947 c0x0000 (---------------) + I oarai 0x0022b205, // n0x0948 c0x0000 (---------------) + I ogawa 0x002b8307, // n0x0949 c0x0000 (---------------) + I omitama 0x0025e349, // n0x094a c0x0000 (---------------) + I ryugasaki 0x00306345, // n0x094b c0x0000 (---------------) + I sakai 0x002c034a, // n0x094c c0x0000 (---------------) + I sakuragawa 0x002508c9, // n0x094d c0x0000 (---------------) + I shimodate 0x002c894a, // n0x094e c0x0000 (---------------) + I shimotsuma 0x0030f489, // n0x094f c0x0000 (---------------) + I shirosato 0x002d7e44, // n0x0950 c0x0000 (---------------) + I sowa 0x002d0a85, // n0x0951 c0x0000 (---------------) + I suifu 0x002cfe88, // n0x0952 c0x0000 (---------------) + I takahagi 0x002a3bcb, // n0x0953 c0x0000 (---------------) + I tamatsukuri 0x002e4345, // n0x0954 c0x0000 (---------------) + I tokai 0x003093c6, // n0x0955 c0x0000 (---------------) + I tomobe 0x0023b784, // n0x0956 c0x0000 (---------------) + I tone 0x00262646, // n0x0957 c0x0000 (---------------) + I toride 0x00228cc9, // n0x0958 c0x0000 (---------------) + I tsuchiura 0x002bf687, // n0x0959 c0x0000 (---------------) + I tsukuba 0x002f9708, // n0x095a c0x0000 (---------------) + I uchihara 0x0028f186, // n0x095b c0x0000 (---------------) + I ushiku 0x00202887, // n0x095c c0x0000 (---------------) + I yachiyo 0x00266548, // n0x095d c0x0000 (---------------) + I yamagata 0x003281c6, // n0x095e c0x0000 (---------------) + I yawara 0x00342404, // n0x095f c0x0000 (---------------) + I yuki 0x00239547, // n0x0960 c0x0000 (---------------) + I anamizu 0x0026d685, // n0x0961 c0x0000 (---------------) + I hakui 0x0026da47, // n0x0962 c0x0000 (---------------) + I hakusan 0x00204844, // n0x0963 c0x0000 (---------------) + I kaga 0x002a9786, // n0x0964 c0x0000 (---------------) + I kahoku 0x0031ff48, // n0x0965 c0x0000 (---------------) + I kanazawa 0x0027bac8, // n0x0966 c0x0000 (---------------) + I kawakita 0x002b1d47, // n0x0967 c0x0000 (---------------) + I komatsu 0x0020ff88, // n0x0968 c0x0000 (---------------) + I nakanoto 0x00234105, // n0x0969 c0x0000 (---------------) + I nanao 0x00206bc4, // n0x096a c0x0000 (---------------) + I nomi 0x00278f08, // n0x096b c0x0000 (---------------) + I nonoichi 0x00210084, // n0x096c c0x0000 (---------------) + I noto 0x002506c5, // n0x096d c0x0000 (---------------) + I shika 0x002de804, // n0x096e c0x0000 (---------------) + I suzu 0x002d8cc7, // n0x096f c0x0000 (---------------) + I tsubata 0x002a8907, // n0x0970 c0x0000 (---------------) + I tsurugi 0x00266dc8, // n0x0971 c0x0000 (---------------) + I uchinada 0x0029dbc6, // n0x0972 c0x0000 (---------------) + I wajima 0x0026a385, // n0x0973 c0x0000 (---------------) + I fudai 0x00261f08, // n0x0974 c0x0000 (---------------) + I fujisawa 0x0026ccc8, // n0x0975 c0x0000 (---------------) + I hanamaki 0x002846c9, // n0x0976 c0x0000 (---------------) + I hiraizumi 0x00226786, // n0x0977 c0x0000 (---------------) + I hirono 0x003427c8, // n0x0978 c0x0000 (---------------) + I ichinohe 0x0020e74a, // n0x0979 c0x0000 (---------------) + I ichinoseki 0x002b7388, // n0x097a c0x0000 (---------------) + I iwaizumi 0x0028f885, // n0x097b c0x0000 (---------------) + I iwate 0x0025a586, // n0x097c c0x0000 (---------------) + I joboji 0x00250788, // n0x097d c0x0000 (---------------) + I kamaishi 0x0023a5ca, // n0x097e c0x0000 (---------------) + I kanegasaki 0x00350b87, // n0x097f c0x0000 (---------------) + I karumai 0x00265905, // n0x0980 c0x0000 (---------------) + I kawai 0x00275cc8, // n0x0981 c0x0000 (---------------) + I kitakami 0x002687c4, // n0x0982 c0x0000 (---------------) + I kuji 0x0021a486, // n0x0983 c0x0000 (---------------) + I kunohe 0x002a4308, // n0x0984 c0x0000 (---------------) + I kuzumaki 0x00215746, // n0x0985 c0x0000 (---------------) + I miyako 0x0022de08, // n0x0986 c0x0000 (---------------) + I mizusawa 0x00273e87, // n0x0987 c0x0000 (---------------) + I morioka 0x002e5bc6, // n0x0988 c0x0000 (---------------) + I ninohe 0x00345804, // n0x0989 c0x0000 (---------------) + I noda 0x003042c7, // n0x098a c0x0000 (---------------) + I ofunato 0x00293fc4, // n0x098b c0x0000 (---------------) + I oshu 0x00228c87, // n0x098c c0x0000 (---------------) + I otsuchi 0x00204c8d, // n0x098d c0x0000 (---------------) + I rikuzentakata 0x00215d85, // n0x098e c0x0000 (---------------) + I shiwa 0x002d114b, // n0x098f c0x0000 (---------------) + I shizukuishi 0x00217a06, // n0x0990 c0x0000 (---------------) + I sumita 0x00347f08, // n0x0991 c0x0000 (---------------) + I takizawa 0x0032d588, // n0x0992 c0x0000 (---------------) + I tanohata 0x00229104, // n0x0993 c0x0000 (---------------) + I tono 0x00294f06, // n0x0994 c0x0000 (---------------) + I yahaba 0x002638c6, // n0x0995 c0x0000 (---------------) + I yamada 0x002b5b47, // n0x0996 c0x0000 (---------------) + I ayagawa 0x0027b14d, // n0x0997 c0x0000 (---------------) + I higashikagawa 0x002e8b07, // n0x0998 c0x0000 (---------------) + I kanonji 0x002956c8, // n0x0999 c0x0000 (---------------) + I kotohira 0x00250405, // n0x099a c0x0000 (---------------) + I manno 0x00274508, // n0x099b c0x0000 (---------------) + I marugame 0x002ab506, // n0x099c c0x0000 (---------------) + I mitoyo 0x00234188, // n0x099d c0x0000 (---------------) + I naoshima 0x002528c6, // n0x099e c0x0000 (---------------) + I sanuki 0x003185c7, // n0x099f c0x0000 (---------------) + I tadotsu 0x0032d709, // n0x09a0 c0x0000 (---------------) + I takamatsu 0x00229107, // n0x09a1 c0x0000 (---------------) + I tonosho 0x0026bc88, // n0x09a2 c0x0000 (---------------) + I uchinomi 0x00255005, // n0x09a3 c0x0000 (---------------) + I utazu 0x00218348, // n0x09a4 c0x0000 (---------------) + I zentsuji 0x0024ad85, // n0x09a5 c0x0000 (---------------) + I akune 0x002279c5, // n0x09a6 c0x0000 (---------------) + I amami 0x00309745, // n0x09a7 c0x0000 (---------------) + I hioki 0x00226dc3, // n0x09a8 c0x0000 (---------------) + I isa 0x00268384, // n0x09a9 c0x0000 (---------------) + I isen 0x00275ec5, // n0x09aa c0x0000 (---------------) + I izumi 0x0034f049, // n0x09ab c0x0000 (---------------) + I kagoshima 0x002de906, // n0x09ac c0x0000 (---------------) + I kanoya 0x00269cc8, // n0x09ad c0x0000 (---------------) + I kawanabe 0x00324b85, // n0x09ae c0x0000 (---------------) + I kinko 0x00296887, // n0x09af c0x0000 (---------------) + I kouyama 0x0027404a, // n0x09b0 c0x0000 (---------------) + I makurazaki 0x00218ec9, // n0x09b1 c0x0000 (---------------) + I matsumoto 0x0025650a, // n0x09b2 c0x0000 (---------------) + I minamitane 0x002b40c8, // n0x09b3 c0x0000 (---------------) + I nakatane 0x00226f4c, // n0x09b4 c0x0000 (---------------) + I nishinoomote 0x0026808d, // n0x09b5 c0x0000 (---------------) + I satsumasendai 0x002d4cc3, // n0x09b6 c0x0000 (---------------) + I soo 0x0022dd08, // n0x09b7 c0x0000 (---------------) + I tarumizu 0x00218985, // n0x09b8 c0x0000 (---------------) + I yusui 0x00279b86, // n0x09b9 c0x0000 (---------------) + I aikawa 0x002a75c6, // n0x09ba c0x0000 (---------------) + I atsugi 0x00351405, // n0x09bb c0x0000 (---------------) + I ayase 0x0031c649, // n0x09bc c0x0000 (---------------) + I chigasaki 0x002ebc45, // n0x09bd c0x0000 (---------------) + I ebina 0x00261f08, // n0x09be c0x0000 (---------------) + I fujisawa 0x00305846, // n0x09bf c0x0000 (---------------) + I hadano 0x0034da86, // n0x09c0 c0x0000 (---------------) + I hakone 0x00286149, // n0x09c1 c0x0000 (---------------) + I hiratsuka 0x00336e47, // n0x09c2 c0x0000 (---------------) + I isehara 0x002d6406, // n0x09c3 c0x0000 (---------------) + I kaisei 0x00273fc8, // n0x09c4 c0x0000 (---------------) + I kamakura 0x002cfac8, // n0x09c5 c0x0000 (---------------) + I kiyokawa 0x00224907, // n0x09c6 c0x0000 (---------------) + I matsuda 0x002d7ace, // n0x09c7 c0x0000 (---------------) + I minamiashigara 0x002ab745, // n0x09c8 c0x0000 (---------------) + I miura 0x002b6905, // n0x09c9 c0x0000 (---------------) + I nakai 0x00215648, // n0x09ca c0x0000 (---------------) + I ninomiya 0x00345847, // n0x09cb c0x0000 (---------------) + I odawara 0x0020a842, // n0x09cc c0x0000 (---------------) + I oi 0x0029f604, // n0x09cd c0x0000 (---------------) + I oiso 0x0025be0a, // n0x09ce c0x0000 (---------------) + I sagamihara 0x00204a08, // n0x09cf c0x0000 (---------------) + I samukawa 0x002dc446, // n0x09d0 c0x0000 (---------------) + I tsukui 0x0027e2c8, // n0x09d1 c0x0000 (---------------) + I yamakita 0x0024d686, // n0x09d2 c0x0000 (---------------) + I yamato 0x002a7388, // n0x09d3 c0x0000 (---------------) + I yokosuka 0x0028e588, // n0x09d4 c0x0000 (---------------) + I yugawara 0x00227984, // n0x09d5 c0x0000 (---------------) + I zama 0x00297185, // n0x09d6 c0x0000 (---------------) + I zushi 0x00625ec4, // n0x09d7 c0x0001 (---------------) ! I city 0x00625ec4, // n0x09d8 c0x0001 (---------------) ! I city 0x00625ec4, // n0x09d9 c0x0001 (---------------) ! I city 0x00200783, // n0x09da c0x0000 (---------------) + I aki 0x002ed086, // n0x09db c0x0000 (---------------) + I geisei 0x002623c6, // n0x09dc c0x0000 (---------------) + I hidaka 0x002829cc, // n0x09dd c0x0000 (---------------) + I higashitsuno 0x00200683, // n0x09de c0x0000 (---------------) + I ino 0x002cc186, // n0x09df c0x0000 (---------------) + I kagami 0x00200d84, // n0x09e0 c0x0000 (---------------) + I kami 0x002acc08, // n0x09e1 c0x0000 (---------------) + I kitagawa 0x002b2f45, // n0x09e2 c0x0000 (---------------) + I kochi 0x0025bf06, // n0x09e3 c0x0000 (---------------) + I mihara 0x00218d48, // n0x09e4 c0x0000 (---------------) + I motoyama 0x002b7e06, // n0x09e5 c0x0000 (---------------) + I muroto 0x002eb806, // n0x09e6 c0x0000 (---------------) + I nahari 0x00273b88, // n0x09e7 c0x0000 (---------------) + I nakamura 0x0021fb87, // n0x09e8 c0x0000 (---------------) + I nankoku 0x00229fc9, // n0x09e9 c0x0000 (---------------) + I nishitosa 0x002309ca, // n0x09ea c0x0000 (---------------) + I niyodogawa 0x00251f04, // n0x09eb c0x0000 (---------------) + I ochi 0x00200ec5, // n0x09ec c0x0000 (---------------) + I okawa 0x00258585, // n0x09ed c0x0000 (---------------) + I otoyo 0x00227286, // n0x09ee c0x0000 (---------------) + I otsuki 0x002b4f46, // n0x09ef c0x0000 (---------------) + I sakawa 0x00282306, // n0x09f0 c0x0000 (---------------) + I sukumo 0x002cae06, // n0x09f1 c0x0000 (---------------) + I susaki 0x0022a104, // n0x09f2 c0x0000 (---------------) + I tosa 0x0022a10b, // n0x09f3 c0x0000 (---------------) + I tosashimizu 0x002519c4, // n0x09f4 c0x0000 (---------------) + I toyo 0x00235045, // n0x09f5 c0x0000 (---------------) + I tsuno 0x0028d1c5, // n0x09f6 c0x0000 (---------------) + I umaji 0x0025e6c6, // n0x09f7 c0x0000 (---------------) + I yasuda 0x00210b48, // n0x09f8 c0x0000 (---------------) + I yusuhara 0x00267f47, // n0x09f9 c0x0000 (---------------) + I amakusa 0x0030f204, // n0x09fa c0x0000 (---------------) + I arao 0x00210a03, // n0x09fb c0x0000 (---------------) + I aso 0x0030c405, // n0x09fc c0x0000 (---------------) + I choyo 0x002530c7, // n0x09fd c0x0000 (---------------) + I gyokuto 0x00287bc9, // n0x09fe c0x0000 (---------------) + I hitoyoshi 0x00267e4b, // n0x09ff c0x0000 (---------------) + I kamiamakusa 0x0029b507, // n0x0a00 c0x0000 (---------------) + I kashima 0x002b5847, // n0x0a01 c0x0000 (---------------) + I kikuchi 0x00290b84, // n0x0a02 c0x0000 (---------------) + I kosa 0x00218c48, // n0x0a03 c0x0000 (---------------) + I kumamoto 0x00311507, // n0x0a04 c0x0000 (---------------) + I mashiki 0x0027ee06, // n0x0a05 c0x0000 (---------------) + I mifune 0x002f1988, // n0x0a06 c0x0000 (---------------) + I minamata 0x00247dcb, // n0x0a07 c0x0000 (---------------) + I minamioguni 0x0033e106, // n0x0a08 c0x0000 (---------------) + I nagasu 0x00234649, // n0x0a09 c0x0000 (---------------) + I nishihara 0x00247f45, // n0x0a0a c0x0000 (---------------) + I oguni 0x002fc943, // n0x0a0b c0x0000 (---------------) + I ozu 0x00218f86, // n0x0a0c c0x0000 (---------------) + I sumoto 0x00273d88, // n0x0a0d c0x0000 (---------------) + I takamori 0x00227343, // n0x0a0e c0x0000 (---------------) + I uki 0x002531c3, // n0x0a0f c0x0000 (---------------) + I uto 0x00266546, // n0x0a10 c0x0000 (---------------) + I yamaga 0x0024d686, // n0x0a11 c0x0000 (---------------) + I yamato 0x0031718a, // n0x0a12 c0x0000 (---------------) + I yatsushiro 0x00263085, // n0x0a13 c0x0000 (---------------) + I ayabe 0x0026370b, // n0x0a14 c0x0000 (---------------) + I fukuchiyama 0x0028330b, // n0x0a15 c0x0000 (---------------) + I higashiyama 0x00260503, // n0x0a16 c0x0000 (---------------) + I ide 0x0020a883, // n0x0a17 c0x0000 (---------------) + I ine 0x002c92c4, // n0x0a18 c0x0000 (---------------) + I joyo 0x002c9707, // n0x0a19 c0x0000 (---------------) + I kameoka 0x00273e04, // n0x0a1a c0x0000 (---------------) + I kamo 0x0023a944, // n0x0a1b c0x0000 (---------------) + I kita 0x002ad344, // n0x0a1c c0x0000 (---------------) + I kizu 0x002b7688, // n0x0a1d c0x0000 (---------------) + I kumiyama 0x002bfbc8, // n0x0a1e c0x0000 (---------------) + I kyotamba 0x0031c949, // n0x0a1f c0x0000 (---------------) + I kyotanabe 0x0021ed08, // n0x0a20 c0x0000 (---------------) + I kyotango 0x002794c7, // n0x0a21 c0x0000 (---------------) + I maizuru 0x0020aa46, // n0x0a22 c0x0000 (---------------) + I minami 0x0026990f, // n0x0a23 c0x0000 (---------------) + I minamiyamashiro 0x002ab886, // n0x0a24 c0x0000 (---------------) + I miyazu 0x002b2ec4, // n0x0a25 c0x0000 (---------------) + I muko 0x002bfa0a, // n0x0a26 c0x0000 (---------------) + I nagaokakyo 0x00252fc7, // n0x0a27 c0x0000 (---------------) + I nakagyo 0x002d99c6, // n0x0a28 c0x0000 (---------------) + I nantan 0x00275b09, // n0x0a29 c0x0000 (---------------) + I oyamazaki 0x0031c8c5, // n0x0a2a c0x0000 (---------------) + I sakyo 0x00306e45, // n0x0a2b c0x0000 (---------------) + I seika 0x0031ca06, // n0x0a2c c0x0000 (---------------) + I tanabe 0x00218483, // n0x0a2d c0x0000 (---------------) + I uji 0x00268809, // n0x0a2e c0x0000 (---------------) + I ujitawara 0x002a2e06, // n0x0a2f c0x0000 (---------------) + I wazuka 0x002c9949, // n0x0a30 c0x0000 (---------------) + I yamashina 0x0032f206, // n0x0a31 c0x0000 (---------------) + I yawata 0x002a5e85, // n0x0a32 c0x0000 (---------------) + I asahi 0x002a2245, // n0x0a33 c0x0000 (---------------) + I inabe 0x00237343, // n0x0a34 c0x0000 (---------------) + I ise 0x002c9848, // n0x0a35 c0x0000 (---------------) + I kameyama 0x002b4fc7, // n0x0a36 c0x0000 (---------------) + I kawagoe 0x00205c44, // n0x0a37 c0x0000 (---------------) + I kiho 0x0023a7c8, // n0x0a38 c0x0000 (---------------) + I kisosaki 0x00336304, // n0x0a39 c0x0000 (---------------) + I kiwa 0x002c29c6, // n0x0a3a c0x0000 (---------------) + I komono 0x002ca246, // n0x0a3b c0x0000 (---------------) + I kumano 0x00239486, // n0x0a3c c0x0000 (---------------) + I kuwana 0x00256b89, // n0x0a3d c0x0000 (---------------) + I matsusaka 0x002f8385, // n0x0a3e c0x0000 (---------------) + I meiwa 0x00287e06, // n0x0a3f c0x0000 (---------------) + I mihama 0x002371c9, // n0x0a40 c0x0000 (---------------) + I minamiise 0x002aa146, // n0x0a41 c0x0000 (---------------) + I misugi 0x00269a06, // n0x0a42 c0x0000 (---------------) + I miyama 0x00332506, // n0x0a43 c0x0000 (---------------) + I nabari 0x00227585, // n0x0a44 c0x0000 (---------------) + I shima 0x002de806, // n0x0a45 c0x0000 (---------------) + I suzuka 0x003185c4, // n0x0a46 c0x0000 (---------------) + I tado 0x002a0145, // n0x0a47 c0x0000 (---------------) + I taiki 0x002a0944, // n0x0a48 c0x0000 (---------------) + I taki 0x00295dc6, // n0x0a49 c0x0000 (---------------) + I tamaki 0x0030f644, // n0x0a4a c0x0000 (---------------) + I toba 0x002030c3, // n0x0a4b c0x0000 (---------------) + I tsu 0x0026af05, // n0x0a4c c0x0000 (---------------) + I udono 0x002356c8, // n0x0a4d c0x0000 (---------------) + I ureshino 0x0028f5c7, // n0x0a4e c0x0000 (---------------) + I watarai 0x002cba49, // n0x0a4f c0x0000 (---------------) + I yokkaichi 0x0026b148, // n0x0a50 c0x0000 (---------------) + I furukawa 0x0027da11, // n0x0a51 c0x0000 (---------------) + I higashimatsushima 0x002005ca, // n0x0a52 c0x0000 (---------------) + I ishinomaki 0x002d6907, // n0x0a53 c0x0000 (---------------) + I iwanuma 0x00306f06, // n0x0a54 c0x0000 (---------------) + I kakuda 0x00200d84, // n0x0a55 c0x0000 (---------------) + I kami 0x002a0a48, // n0x0a56 c0x0000 (---------------) + I kawasaki 0x0033e289, // n0x0a57 c0x0000 (---------------) + I kesennuma 0x00276dc8, // n0x0a58 c0x0000 (---------------) + I marumori 0x0027dbca, // n0x0a59 c0x0000 (---------------) + I matsushima 0x00248acd, // n0x0a5a c0x0000 (---------------) + I minamisanriku 0x00279206, // n0x0a5b c0x0000 (---------------) + I misato 0x00273c86, // n0x0a5c c0x0000 (---------------) + I murata 0x00304386, // n0x0a5d c0x0000 (---------------) + I natori 0x0022b207, // n0x0a5e c0x0000 (---------------) + I ogawara 0x00295785, // n0x0a5f c0x0000 (---------------) + I ohira 0x002914c7, // n0x0a60 c0x0000 (---------------) + I onagawa 0x0023a885, // n0x0a61 c0x0000 (---------------) + I osaki 0x002cda04, // n0x0a62 c0x0000 (---------------) + I rifu 0x002bb686, // n0x0a63 c0x0000 (---------------) + I semine 0x0020b0c7, // n0x0a64 c0x0000 (---------------) + I shibata 0x00330ccd, // n0x0a65 c0x0000 (---------------) + I shichikashuku 0x002506c7, // n0x0a66 c0x0000 (---------------) + I shikama 0x002affc8, // n0x0a67 c0x0000 (---------------) + I shiogama 0x00262209, // n0x0a68 c0x0000 (---------------) + I shiroishi 0x00285cc6, // n0x0a69 c0x0000 (---------------) + I tagajo 0x0025f085, // n0x0a6a c0x0000 (---------------) + I taiwa 0x00254084, // n0x0a6b c0x0000 (---------------) + I tome 0x00277ac6, // n0x0a6c c0x0000 (---------------) + I tomiya 0x002fc586, // n0x0a6d c0x0000 (---------------) + I wakuya 0x00204b86, // n0x0a6e c0x0000 (---------------) + I watari 0x00280d48, // n0x0a6f c0x0000 (---------------) + I yamamoto 0x0022fc43, // n0x0a70 c0x0000 (---------------) + I zao 0x0024d643, // n0x0a71 c0x0000 (---------------) + I aya 0x00224085, // n0x0a72 c0x0000 (---------------) + I ebino 0x00319c06, // n0x0a73 c0x0000 (---------------) + I gokase 0x0028e545, // n0x0a74 c0x0000 (---------------) + I hyuga 0x0028f388, // n0x0a75 c0x0000 (---------------) + I kadogawa 0x00281d8a, // n0x0a76 c0x0000 (---------------) + I kawaminami 0x002eca04, // n0x0a77 c0x0000 (---------------) + I kijo 0x002acc08, // n0x0a78 c0x0000 (---------------) + I kitagawa 0x00298a08, // n0x0a79 c0x0000 (---------------) + I kitakata 0x0025e507, // n0x0a7a c0x0000 (---------------) + I kitaura 0x00324c49, // n0x0a7b c0x0000 (---------------) + I kobayashi 0x0029d188, // n0x0a7c c0x0000 (---------------) + I kunitomi 0x00227507, // n0x0a7d c0x0000 (---------------) + I kushima 0x0029f106, // n0x0a7e c0x0000 (---------------) + I mimata 0x0021574a, // n0x0a7f c0x0000 (---------------) + I miyakonojo 0x00277b48, // n0x0a80 c0x0000 (---------------) + I miyazaki 0x002e7d49, // n0x0a81 c0x0000 (---------------) + I morotsuka 0x002c8fc8, // n0x0a82 c0x0000 (---------------) + I nichinan 0x00307989, // n0x0a83 c0x0000 (---------------) + I nishimera 0x00313ac7, // n0x0a84 c0x0000 (---------------) + I nobeoka 0x002d1505, // n0x0a85 c0x0000 (---------------) + I saito 0x0028d9c6, // n0x0a86 c0x0000 (---------------) + I shiiba 0x002ccd08, // n0x0a87 c0x0000 (---------------) + I shintomi 0x0023aac8, // n0x0a88 c0x0000 (---------------) + I takaharu 0x00298b88, // n0x0a89 c0x0000 (---------------) + I takanabe 0x002da488, // n0x0a8a c0x0000 (---------------) + I takazaki 0x00235045, // n0x0a8b c0x0000 (---------------) + I tsuno 0x002028c4, // n0x0a8c c0x0000 (---------------) + I achi 0x0030eb88, // n0x0a8d c0x0000 (---------------) + I agematsu 0x002a2f44, // n0x0a8e c0x0000 (---------------) + I anan 0x0030f284, // n0x0a8f c0x0000 (---------------) + I aoki 0x002a5e85, // n0x0a90 c0x0000 (---------------) + I asahi 0x00277687, // n0x0a91 c0x0000 (---------------) + I azumino 0x0025e109, // n0x0a92 c0x0000 (---------------) + I chikuhoku 0x002b5947, // n0x0a93 c0x0000 (---------------) + I chikuma 0x00206cc5, // n0x0a94 c0x0000 (---------------) + I chino 0x00260a86, // n0x0a95 c0x0000 (---------------) + I fujimi 0x0026d4c6, // n0x0a96 c0x0000 (---------------) + I hakuba 0x0020da84, // n0x0a97 c0x0000 (---------------) + I hara 0x00286486, // n0x0a98 c0x0000 (---------------) + I hiraya 0x0026a1c4, // n0x0a99 c0x0000 (---------------) + I iida 0x00276cc6, // n0x0a9a c0x0000 (---------------) + I iijima 0x0020b786, // n0x0a9b c0x0000 (---------------) + I iiyama 0x0025dc46, // n0x0a9c c0x0000 (---------------) + I iizuna 0x00205505, // n0x0a9d c0x0000 (---------------) + I ikeda 0x0028f247, // n0x0a9e c0x0000 (---------------) + I ikusaka 0x00208ac3, // n0x0a9f c0x0000 (---------------) + I ina 0x00349e09, // n0x0aa0 c0x0000 (---------------) + I karuizawa 0x002d6108, // n0x0aa1 c0x0000 (---------------) + I kawakami 0x00227384, // n0x0aa2 c0x0000 (---------------) + I kiso 0x0022738d, // n0x0aa3 c0x0000 (---------------) + I kisofukushima 0x0027bbc8, // n0x0aa4 c0x0000 (---------------) + I kitaaiki 0x002a1248, // n0x0aa5 c0x0000 (---------------) + I komagane 0x002e7cc6, // n0x0aa6 c0x0000 (---------------) + I komoro 0x0032d809, // n0x0aa7 c0x0000 (---------------) + I matsukawa 0x00218ec9, // n0x0aa8 c0x0000 (---------------) + I matsumoto 0x002289c5, // n0x0aa9 c0x0000 (---------------) + I miasa 0x00281e8a, // n0x0aaa c0x0000 (---------------) + I minamiaiki 0x0023f64a, // n0x0aab c0x0000 (---------------) + I minamimaki 0x0024074c, // n0x0aac c0x0000 (---------------) + I minamiminowa 0x002408c6, // n0x0aad c0x0000 (---------------) + I minowa 0x00260f46, // n0x0aae c0x0000 (---------------) + I miyada 0x002aba06, // n0x0aaf c0x0000 (---------------) + I miyota 0x00251ec9, // n0x0ab0 c0x0000 (---------------) + I mochizuki 0x0030f046, // n0x0ab1 c0x0000 (---------------) + I nagano 0x0021d206, // n0x0ab2 c0x0000 (---------------) + I nagawa 0x002ebd06, // n0x0ab3 c0x0000 (---------------) + I nagiso 0x002a1cc8, // n0x0ab4 c0x0000 (---------------) + I nakagawa 0x0020ff86, // n0x0ab5 c0x0000 (---------------) + I nakano 0x00217c8b, // n0x0ab6 c0x0000 (---------------) + I nozawaonsen 0x00277805, // n0x0ab7 c0x0000 (---------------) + I obuse 0x0022b205, // n0x0ab8 c0x0000 (---------------) + I ogawa 0x002611c5, // n0x0ab9 c0x0000 (---------------) + I okaya 0x00230586, // n0x0aba c0x0000 (---------------) + I omachi 0x00206c03, // n0x0abb c0x0000 (---------------) + I omi 0x00239406, // n0x0abc c0x0000 (---------------) + I ookuwa 0x00250647, // n0x0abd c0x0000 (---------------) + I ooshika 0x002a0905, // n0x0abe c0x0000 (---------------) + I otaki 0x0026fd05, // n0x0abf c0x0000 (---------------) + I otari 0x00290e45, // n0x0ac0 c0x0000 (---------------) + I sakae 0x002d4f86, // n0x0ac1 c0x0000 (---------------) + I sakaki 0x00228a84, // n0x0ac2 c0x0000 (---------------) + I saku 0x0032bb06, // n0x0ac3 c0x0000 (---------------) + I sakuho 0x002c7fc9, // n0x0ac4 c0x0000 (---------------) + I shimosuwa 0x0023040c, // n0x0ac5 c0x0000 (---------------) + I shinanomachi 0x002cd748, // n0x0ac6 c0x0000 (---------------) + I shiojiri 0x0024f504, // n0x0ac7 c0x0000 (---------------) + I suwa 0x002e8a06, // n0x0ac8 c0x0000 (---------------) + I suzaka 0x00217b06, // n0x0ac9 c0x0000 (---------------) + I takagi 0x00273d88, // n0x0aca c0x0000 (---------------) + I takamori 0x002d6ac8, // n0x0acb c0x0000 (---------------) + I takayama 0x00230309, // n0x0acc c0x0000 (---------------) + I tateshina 0x00234fc7, // n0x0acd c0x0000 (---------------) + I tatsuno 0x002c1a89, // n0x0ace c0x0000 (---------------) + I togakushi 0x00266986, // n0x0acf c0x0000 (---------------) + I togura 0x00277ac4, // n0x0ad0 c0x0000 (---------------) + I tomi 0x00269fc4, // n0x0ad1 c0x0000 (---------------) + I ueda 0x0026b8c4, // n0x0ad2 c0x0000 (---------------) + I wada 0x00266548, // n0x0ad3 c0x0000 (---------------) + I yamagata 0x0025df4a, // n0x0ad4 c0x0000 (---------------) + I yamanouchi 0x003062c6, // n0x0ad5 c0x0000 (---------------) + I yasaka 0x003111c7, // n0x0ad6 c0x0000 (---------------) + I yasuoka 0x0023e2c7, // n0x0ad7 c0x0000 (---------------) + I chijiwa 0x0026a745, // n0x0ad8 c0x0000 (---------------) + I futsu 0x002ca5c4, // n0x0ad9 c0x0000 (---------------) + I goto 0x00273746, // n0x0ada c0x0000 (---------------) + I hasami 0x002957c6, // n0x0adb c0x0000 (---------------) + I hirado 0x00205c03, // n0x0adc c0x0000 (---------------) + I iki 0x002d5f47, // n0x0add c0x0000 (---------------) + I isahaya 0x002826c8, // n0x0ade c0x0000 (---------------) + I kawatana 0x00228b0a, // n0x0adf c0x0000 (---------------) + I kuchinotsu 0x002d7108, // n0x0ae0 c0x0000 (---------------) + I matsuura 0x002e9c88, // n0x0ae1 c0x0000 (---------------) + I nagasaki 0x0030f685, // n0x0ae2 c0x0000 (---------------) + I obama 0x00295905, // n0x0ae3 c0x0000 (---------------) + I omura 0x002c19c5, // n0x0ae4 c0x0000 (---------------) + I oseto 0x0026ab06, // n0x0ae5 c0x0000 (---------------) + I saikai 0x00275346, // n0x0ae6 c0x0000 (---------------) + I sasebo 0x002b3105, // n0x0ae7 c0x0000 (---------------) + I seihi 0x002fa789, // n0x0ae8 c0x0000 (---------------) + I shimabara 0x002ca3cc, // n0x0ae9 c0x0000 (---------------) + I shinkamigoto 0x00238747, // n0x0aea c0x0000 (---------------) + I togitsu 0x0027dc48, // n0x0aeb c0x0000 (---------------) + I tsushima 0x00272dc5, // n0x0aec c0x0000 (---------------) + I unzen 0x00625ec4, // n0x0aed c0x0001 (---------------) ! I city 0x002236c4, // n0x0aee c0x0000 (---------------) + I ando 0x00329944, // n0x0aef c0x0000 (---------------) + I gose 0x00255dc6, // n0x0af0 c0x0000 (---------------) + I heguri 0x00283e8e, // n0x0af1 c0x0000 (---------------) + I higashiyoshino 0x002bbd87, // n0x0af2 c0x0000 (---------------) + I ikaruga 0x0022b405, // n0x0af3 c0x0000 (---------------) + I ikoma 0x0024d48c, // n0x0af4 c0x0000 (---------------) + I kamikitayama 0x002cf987, // n0x0af5 c0x0000 (---------------) + I kanmaki 0x0020b047, // n0x0af6 c0x0000 (---------------) + I kashiba 0x0020d949, // n0x0af7 c0x0000 (---------------) + I kashihara 0x0028a1c9, // n0x0af8 c0x0000 (---------------) + I katsuragi 0x00265905, // n0x0af9 c0x0000 (---------------) + I kawai 0x002d6108, // n0x0afa c0x0000 (---------------) + I kawakami 0x00200f09, // n0x0afb c0x0000 (---------------) + I kawanishi 0x00290145, // n0x0afc c0x0000 (---------------) + I koryo 0x002a0848, // n0x0afd c0x0000 (---------------) + I kurotaki 0x002b2d46, // n0x0afe c0x0000 (---------------) + I mitsue 0x00206e06, // n0x0aff c0x0000 (---------------) + I miyake 0x00334484, // n0x0b00 c0x0000 (---------------) + I nara 0x00224148, // n0x0b01 c0x0000 (---------------) + I nosegawa 0x0025a643, // n0x0b02 c0x0000 (---------------) + I oji 0x002ed244, // n0x0b03 c0x0000 (---------------) + I ouda 0x0030c485, // n0x0b04 c0x0000 (---------------) + I oyodo 0x002a2747, // n0x0b05 c0x0000 (---------------) + I sakurai 0x00246745, // n0x0b06 c0x0000 (---------------) + I sango 0x0020e609, // n0x0b07 c0x0000 (---------------) + I shimoichi 0x0032228d, // n0x0b08 c0x0000 (---------------) + I shimokitayama 0x002c91c6, // n0x0b09 c0x0000 (---------------) + I shinjo 0x00309c04, // n0x0b0a c0x0000 (---------------) + I soni 0x002d1848, // n0x0b0b c0x0000 (---------------) + I takatori 0x0020a60a, // n0x0b0c c0x0000 (---------------) + I tawaramoto 0x00274987, // n0x0b0d c0x0000 (---------------) + I tenkawa 0x002e1645, // n0x0b0e c0x0000 (---------------) + I tenri 0x00224a03, // n0x0b0f c0x0000 (---------------) + I uda 0x002834ce, // n0x0b10 c0x0000 (---------------) + I yamatokoriyama 0x0024d68c, // n0x0b11 c0x0000 (---------------) + I yamatotakada 0x002cd587, // n0x0b12 c0x0000 (---------------) + I yamazoe 0x00284047, // n0x0b13 c0x0000 (---------------) + I yoshino 0x00204883, // n0x0b14 c0x0000 (---------------) + I aga 0x0030f085, // n0x0b15 c0x0000 (---------------) + I agano 0x00329945, // n0x0b16 c0x0000 (---------------) + I gosen 0x0027e688, // n0x0b17 c0x0000 (---------------) + I itoigawa 0x0027ab09, // n0x0b18 c0x0000 (---------------) + I izumozaki 0x00207186, // n0x0b19 c0x0000 (---------------) + I joetsu 0x00273e04, // n0x0b1a c0x0000 (---------------) + I kamo 0x002d6846, // n0x0b1b c0x0000 (---------------) + I kariwa 0x002176cb, // n0x0b1c c0x0000 (---------------) + I kashiwazaki 0x0025690c, // n0x0b1d c0x0000 (---------------) + I minamiuonuma 0x00264a07, // n0x0b1e c0x0000 (---------------) + I mitsuke 0x002b2c05, // n0x0b1f c0x0000 (---------------) + I muika 0x0026f708, // n0x0b20 c0x0000 (---------------) + I murakami 0x002246c5, // n0x0b21 c0x0000 (---------------) + I myoko 0x002bfa07, // n0x0b22 c0x0000 (---------------) + I nagaoka 0x002871c7, // n0x0b23 c0x0000 (---------------) + I niigata 0x0028ed05, // n0x0b24 c0x0000 (---------------) + I ojiya 0x00206c03, // n0x0b25 c0x0000 (---------------) + I omi 0x0022eac4, // n0x0b26 c0x0000 (---------------) + I sado 0x00248245, // n0x0b27 c0x0000 (---------------) + I sanjo 0x002ed145, // n0x0b28 c0x0000 (---------------) + I seiro 0x002ed146, // n0x0b29 c0x0000 (---------------) + I seirou 0x002c7dc8, // n0x0b2a c0x0000 (---------------) + I sekikawa 0x0020b0c7, // n0x0b2b c0x0000 (---------------) + I shibata 0x002a78c6, // n0x0b2c c0x0000 (---------------) + I tagami 0x00279a86, // n0x0b2d c0x0000 (---------------) + I tainai 0x00309686, // n0x0b2e c0x0000 (---------------) + I tochio 0x00294189, // n0x0b2f c0x0000 (---------------) + I tokamachi 0x00345147, // n0x0b30 c0x0000 (---------------) + I tsubame 0x0026cac6, // n0x0b31 c0x0000 (---------------) + I tsunan 0x00256a86, // n0x0b32 c0x0000 (---------------) + I uonuma 0x002b5486, // n0x0b33 c0x0000 (---------------) + I yahiko 0x002c9345, // n0x0b34 c0x0000 (---------------) + I yoita 0x002237c6, // n0x0b35 c0x0000 (---------------) + I yuzawa 0x0033de85, // n0x0b36 c0x0000 (---------------) + I beppu 0x00206a48, // n0x0b37 c0x0000 (---------------) + I bungoono 0x0029988b, // n0x0b38 c0x0000 (---------------) + I bungotakada 0x00273546, // n0x0b39 c0x0000 (---------------) + I hasama 0x0023e304, // n0x0b3a c0x0000 (---------------) + I hiji 0x002cf109, // n0x0b3b c0x0000 (---------------) + I himeshima 0x00286d44, // n0x0b3c c0x0000 (---------------) + I hita 0x002b2cc8, // n0x0b3d c0x0000 (---------------) + I kamitsue 0x0031eac7, // n0x0b3e c0x0000 (---------------) + I kokonoe 0x00330f84, // n0x0b3f c0x0000 (---------------) + I kuju 0x0029c748, // n0x0b40 c0x0000 (---------------) + I kunisaki 0x002a32c4, // n0x0b41 c0x0000 (---------------) + I kusu 0x002c9384, // n0x0b42 c0x0000 (---------------) + I oita 0x0026b6c5, // n0x0b43 c0x0000 (---------------) + I saiki 0x0029b386, // n0x0b44 c0x0000 (---------------) + I taketa 0x002b75c7, // n0x0b45 c0x0000 (---------------) + I tsukumi 0x0022dec3, // n0x0b46 c0x0000 (---------------) + I usa 0x00282f45, // n0x0b47 c0x0000 (---------------) + I usuki 0x002654c4, // n0x0b48 c0x0000 (---------------) + I yufu 0x002b6946, // n0x0b49 c0x0000 (---------------) + I akaiwa 0x00228a48, // n0x0b4a c0x0000 (---------------) + I asakuchi 0x002b5185, // n0x0b4b c0x0000 (---------------) + I bizen 0x00277189, // n0x0b4c c0x0000 (---------------) + I hayashima 0x002555c5, // n0x0b4d c0x0000 (---------------) + I ibara 0x0030f8c8, // n0x0b4e c0x0000 (---------------) + I kagamino 0x00200c47, // n0x0b4f c0x0000 (---------------) + I kasaoka 0x002fc788, // n0x0b50 c0x0000 (---------------) + I kibichuo 0x0029be87, // n0x0b51 c0x0000 (---------------) + I kumenan 0x00335fc9, // n0x0b52 c0x0000 (---------------) + I kurashiki 0x002eb986, // n0x0b53 c0x0000 (---------------) + I maniwa 0x002aaf86, // n0x0b54 c0x0000 (---------------) + I misaki 0x002ebd04, // n0x0b55 c0x0000 (---------------) + I nagi 0x002d7a05, // n0x0b56 c0x0000 (---------------) + I niimi 0x0021958c, // n0x0b57 c0x0000 (---------------) + I nishiawakura 0x002611c7, // n0x0b58 c0x0000 (---------------) + I okayama 0x002618c7, // n0x0b59 c0x0000 (---------------) + I satosho 0x0023e188, // n0x0b5a c0x0000 (---------------) + I setouchi 0x002c91c6, // n0x0b5b c0x0000 (---------------) + I shinjo 0x002e81c4, // n0x0b5c c0x0000 (---------------) + I shoo 0x0029f684, // n0x0b5d c0x0000 (---------------) + I soja 0x002ac8c9, // n0x0b5e c0x0000 (---------------) + I takahashi 0x002abb06, // n0x0b5f c0x0000 (---------------) + I tamano 0x0027e207, // n0x0b60 c0x0000 (---------------) + I tsuyama 0x00292644, // n0x0b61 c0x0000 (---------------) + I wake 0x002758c6, // n0x0b62 c0x0000 (---------------) + I yakage 0x00207ec5, // n0x0b63 c0x0000 (---------------) + I aguni 0x00287047, // n0x0b64 c0x0000 (---------------) + I ginowan 0x00217c06, // n0x0b65 c0x0000 (---------------) + I ginoza 0x00253ac9, // n0x0b66 c0x0000 (---------------) + I gushikami 0x003108c7, // n0x0b67 c0x0000 (---------------) + I haebaru 0x00278307, // n0x0b68 c0x0000 (---------------) + I higashi 0x00285fc6, // n0x0b69 c0x0000 (---------------) + I hirara 0x002eb005, // n0x0b6a c0x0000 (---------------) + I iheya 0x00265288, // n0x0b6b c0x0000 (---------------) + I ishigaki 0x002a2c88, // n0x0b6c c0x0000 (---------------) + I ishikawa 0x0020ac46, // n0x0b6d c0x0000 (---------------) + I itoman 0x002b51c5, // n0x0b6e c0x0000 (---------------) + I izena 0x00344506, // n0x0b6f c0x0000 (---------------) + I kadena 0x00207883, // n0x0b70 c0x0000 (---------------) + I kin 0x0027e509, // n0x0b71 c0x0000 (---------------) + I kitadaito 0x0028208e, // n0x0b72 c0x0000 (---------------) + I kitanakagusuku 0x0029bb48, // n0x0b73 c0x0000 (---------------) + I kumejima 0x00336408, // n0x0b74 c0x0000 (---------------) + I kunigami 0x0020aa4b, // n0x0b75 c0x0000 (---------------) + I minamidaito 0x002773c6, // n0x0b76 c0x0000 (---------------) + I motobu 0x00205344, // n0x0b77 c0x0000 (---------------) + I nago 0x00267c84, // n0x0b78 c0x0000 (---------------) + I naha 0x0028218a, // n0x0b79 c0x0000 (---------------) + I nakagusuku 0x00212b87, // n0x0b7a c0x0000 (---------------) + I nakijin 0x0026cb85, // n0x0b7b c0x0000 (---------------) + I nanjo 0x00234649, // n0x0b7c c0x0000 (---------------) + I nishihara 0x0029f045, // n0x0b7d c0x0000 (---------------) + I ogimi 0x0030f2c7, // n0x0b7e c0x0000 (---------------) + I okinawa 0x002121c4, // n0x0b7f c0x0000 (---------------) + I onna 0x00301907, // n0x0b80 c0x0000 (---------------) + I shimoji 0x002f1b08, // n0x0b81 c0x0000 (---------------) + I taketomi 0x002d0fc6, // n0x0b82 c0x0000 (---------------) + I tarama 0x002aa2c9, // n0x0b83 c0x0000 (---------------) + I tokashiki 0x0029d28a, // n0x0b84 c0x0000 (---------------) + I tomigusuku 0x00212b06, // n0x0b85 c0x0000 (---------------) + I tonaki 0x0027b706, // n0x0b86 c0x0000 (---------------) + I urasoe 0x0028d145, // n0x0b87 c0x0000 (---------------) + I uruma 0x0032c445, // n0x0b88 c0x0000 (---------------) + I yaese 0x0031a707, // n0x0b89 c0x0000 (---------------) + I yomitan 0x00350648, // n0x0b8a c0x0000 (---------------) + I yonabaru 0x00207e08, // n0x0b8b c0x0000 (---------------) + I yonaguni 0x00227986, // n0x0b8c c0x0000 (---------------) + I zamami 0x002ffbc5, // n0x0b8d c0x0000 (---------------) + I abeno 0x002b4cce, // n0x0b8e c0x0000 (---------------) + I chihayaakasaka 0x002f8704, // n0x0b8f c0x0000 (---------------) + I chuo 0x0020abc5, // n0x0b90 c0x0000 (---------------) + I daito 0x00260409, // n0x0b91 c0x0000 (---------------) + I fujiidera 0x00265708, // n0x0b92 c0x0000 (---------------) + I habikino 0x00270786, // n0x0b93 c0x0000 (---------------) + I hannan 0x002809cc, // n0x0b94 c0x0000 (---------------) + I higashiosaka 0x00281990, // n0x0b95 c0x0000 (---------------) + I higashisumiyoshi 0x00283acf, // n0x0b96 c0x0000 (---------------) + I higashiyodogawa 0x00285048, // n0x0b97 c0x0000 (---------------) + I hirakata 0x00329287, // n0x0b98 c0x0000 (---------------) + I ibaraki 0x00205505, // n0x0b99 c0x0000 (---------------) + I ikeda 0x00275ec5, // n0x0b9a c0x0000 (---------------) + I izumi 0x002b7449, // n0x0b9b c0x0000 (---------------) + I izumiotsu 0x00275ec9, // n0x0b9c c0x0000 (---------------) + I izumisano 0x0021ca86, // n0x0b9d c0x0000 (---------------) + I kadoma 0x002e43c7, // n0x0b9e c0x0000 (---------------) + I kaizuka 0x002a2f05, // n0x0b9f c0x0000 (---------------) + I kanan 0x00215d09, // n0x0ba0 c0x0000 (---------------) + I kashiwara 0x0032d506, // n0x0ba1 c0x0000 (---------------) + I katano 0x0030ee8d, // n0x0ba2 c0x0000 (---------------) + I kawachinagano 0x0026b789, // n0x0ba3 c0x0000 (---------------) + I kishiwada 0x0023a944, // n0x0ba4 c0x0000 (---------------) + I kita 0x0029b8c8, // n0x0ba5 c0x0000 (---------------) + I kumatori 0x0030ec49, // n0x0ba6 c0x0000 (---------------) + I matsubara 0x00306486, // n0x0ba7 c0x0000 (---------------) + I minato 0x00260b85, // n0x0ba8 c0x0000 (---------------) + I minoh 0x002aaf86, // n0x0ba9 c0x0000 (---------------) + I misaki 0x002f95c9, // n0x0baa c0x0000 (---------------) + I moriguchi 0x002ac2c8, // n0x0bab c0x0000 (---------------) + I neyagawa 0x00201005, // n0x0bac c0x0000 (---------------) + I nishi 0x0020e844, // n0x0bad c0x0000 (---------------) + I nose 0x00280b8b, // n0x0bae c0x0000 (---------------) + I osakasayama 0x00306345, // n0x0baf c0x0000 (---------------) + I sakai 0x00272486, // n0x0bb0 c0x0000 (---------------) + I sayama 0x0024f986, // n0x0bb1 c0x0000 (---------------) + I sennan 0x002e0406, // n0x0bb2 c0x0000 (---------------) + I settsu 0x00324dcb, // n0x0bb3 c0x0000 (---------------) + I shijonawate 0x00277289, // n0x0bb4 c0x0000 (---------------) + I shimamoto 0x002923c5, // n0x0bb5 c0x0000 (---------------) + I suita 0x00249647, // n0x0bb6 c0x0000 (---------------) + I tadaoka 0x00200546, // n0x0bb7 c0x0000 (---------------) + I taishi 0x00267146, // n0x0bb8 c0x0000 (---------------) + I tajiri 0x003296c8, // n0x0bb9 c0x0000 (---------------) + I takaishi 0x00267609, // n0x0bba c0x0000 (---------------) + I takatsuki 0x002afd8c, // n0x0bbb c0x0000 (---------------) + I tondabayashi 0x00252ec8, // n0x0bbc c0x0000 (---------------) + I toyonaka 0x0025c5c6, // n0x0bbd c0x0000 (---------------) + I toyono 0x002e8903, // n0x0bbe c0x0000 (---------------) + I yao 0x002343c6, // n0x0bbf c0x0000 (---------------) + I ariake 0x0028d805, // n0x0bc0 c0x0000 (---------------) + I arita 0x00263a48, // n0x0bc1 c0x0000 (---------------) + I fukudomi 0x00221506, // n0x0bc2 c0x0000 (---------------) + I genkai 0x00313e88, // n0x0bc3 c0x0000 (---------------) + I hamatama 0x00307885, // n0x0bc4 c0x0000 (---------------) + I hizen 0x00325705, // n0x0bc5 c0x0000 (---------------) + I imari 0x002e4708, // n0x0bc6 c0x0000 (---------------) + I kamimine 0x00294887, // n0x0bc7 c0x0000 (---------------) + I kanzaki 0x002a7507, // n0x0bc8 c0x0000 (---------------) + I karatsu 0x0029b507, // n0x0bc9 c0x0000 (---------------) + I kashima 0x0023a948, // n0x0bca c0x0000 (---------------) + I kitagata 0x003293c8, // n0x0bcb c0x0000 (---------------) + I kitahata 0x00271906, // n0x0bcc c0x0000 (---------------) + I kiyama 0x00295c07, // n0x0bcd c0x0000 (---------------) + I kouhoku 0x002a60c7, // n0x0bce c0x0000 (---------------) + I kyuragi 0x0028d6ca, // n0x0bcf c0x0000 (---------------) + I nishiarita 0x00238783, // n0x0bd0 c0x0000 (---------------) + I ogi 0x00230586, // n0x0bd1 c0x0000 (---------------) + I omachi 0x0023e245, // n0x0bd2 c0x0000 (---------------) + I ouchi 0x00259b04, // n0x0bd3 c0x0000 (---------------) + I saga 0x00262209, // n0x0bd4 c0x0000 (---------------) + I shiroishi 0x00335f44, // n0x0bd5 c0x0000 (---------------) + I taku 0x0021eb44, // n0x0bd6 c0x0000 (---------------) + I tara 0x0027bec4, // n0x0bd7 c0x0000 (---------------) + I tosu 0x0028404b, // n0x0bd8 c0x0000 (---------------) + I yoshinogari 0x0030edc7, // n0x0bd9 c0x0000 (---------------) + I arakawa 0x002b4f05, // n0x0bda c0x0000 (---------------) + I asaka 0x002784c8, // n0x0bdb c0x0000 (---------------) + I chichibu 0x00260a86, // n0x0bdc c0x0000 (---------------) + I fujimi 0x00260a88, // n0x0bdd c0x0000 (---------------) + I fujimino 0x00262fc6, // n0x0bde c0x0000 (---------------) + I fukaya 0x00270d05, // n0x0bdf c0x0000 (---------------) + I hanno 0x00271245, // n0x0be0 c0x0000 (---------------) + I hanyu 0x00274b46, // n0x0be1 c0x0000 (---------------) + I hasuda 0x00275748, // n0x0be2 c0x0000 (---------------) + I hatogaya 0x00275a48, // n0x0be3 c0x0000 (---------------) + I hatoyama 0x002623c6, // n0x0be4 c0x0000 (---------------) + I hidaka 0x0027830f, // n0x0be5 c0x0000 (---------------) + I higashichichibu 0x0027dfd0, // n0x0be6 c0x0000 (---------------) + I higashimatsuyama 0x0020edc5, // n0x0be7 c0x0000 (---------------) + I honjo 0x00208ac3, // n0x0be8 c0x0000 (---------------) + I ina 0x002e3dc5, // n0x0be9 c0x0000 (---------------) + I iruma 0x0028f9c8, // n0x0bea c0x0000 (---------------) + I iwatsuki 0x00275dc9, // n0x0beb c0x0000 (---------------) + I kamiizumi 0x002a8548, // n0x0bec c0x0000 (---------------) + I kamikawa 0x002e7f08, // n0x0bed c0x0000 (---------------) + I kamisato 0x0021ae88, // n0x0bee c0x0000 (---------------) + I kasukabe 0x002b4fc7, // n0x0bef c0x0000 (---------------) + I kawagoe 0x00260749, // n0x0bf0 c0x0000 (---------------) + I kawaguchi 0x00314088, // n0x0bf1 c0x0000 (---------------) + I kawajima 0x0022ef84, // n0x0bf2 c0x0000 (---------------) + I kazo 0x0027bd48, // n0x0bf3 c0x0000 (---------------) + I kitamoto 0x00285949, // n0x0bf4 c0x0000 (---------------) + I koshigaya 0x00296207, // n0x0bf5 c0x0000 (---------------) + I kounosu 0x0029d484, // n0x0bf6 c0x0000 (---------------) + I kuki 0x002b5a08, // n0x0bf7 c0x0000 (---------------) + I kumagaya 0x0028f00a, // n0x0bf8 c0x0000 (---------------) + I matsubushi 0x00310a86, // n0x0bf9 c0x0000 (---------------) + I minano 0x00279206, // n0x0bfa c0x0000 (---------------) + I misato 0x00226649, // n0x0bfb c0x0000 (---------------) + I miyashiro 0x00281bc7, // n0x0bfc c0x0000 (---------------) + I miyoshi 0x002b0388, // n0x0bfd c0x0000 (---------------) + I moroyama 0x0021a288, // n0x0bfe c0x0000 (---------------) + I nagatoro 0x00344d48, // n0x0bff c0x0000 (---------------) + I namegawa 0x0034abc5, // n0x0c00 c0x0000 (---------------) + I niiza 0x00254b05, // n0x0c01 c0x0000 (---------------) + I ogano 0x0022b205, // n0x0c02 c0x0000 (---------------) + I ogawa 0x00329905, // n0x0c03 c0x0000 (---------------) + I ogose 0x00301507, // n0x0c04 c0x0000 (---------------) + I okegawa 0x00206dc5, // n0x0c05 c0x0000 (---------------) + I omiya 0x002a0905, // n0x0c06 c0x0000 (---------------) + I otaki 0x0033f486, // n0x0c07 c0x0000 (---------------) + I ranzan 0x002a8487, // n0x0c08 c0x0000 (---------------) + I ryokami 0x002a3b07, // n0x0c09 c0x0000 (---------------) + I saitama 0x0028f306, // n0x0c0a c0x0000 (---------------) + I sakado 0x002b4605, // n0x0c0b c0x0000 (---------------) + I satte 0x00272486, // n0x0c0c c0x0000 (---------------) + I sayama 0x002aa3c5, // n0x0c0d c0x0000 (---------------) + I shiki 0x002cf808, // n0x0c0e c0x0000 (---------------) + I shiraoka 0x00313784, // n0x0c0f c0x0000 (---------------) + I soka 0x002aa1c6, // n0x0c10 c0x0000 (---------------) + I sugito 0x0020d704, // n0x0c11 c0x0000 (---------------) + I toda 0x002fb748, // n0x0c12 c0x0000 (---------------) + I tokigawa 0x002ca90a, // n0x0c13 c0x0000 (---------------) + I tokorozawa 0x003186cc, // n0x0c14 c0x0000 (---------------) + I tsurugashima 0x0021c005, // n0x0c15 c0x0000 (---------------) + I urawa 0x0022b2c6, // n0x0c16 c0x0000 (---------------) + I warabi 0x002aff46, // n0x0c17 c0x0000 (---------------) + I yashio 0x00319046, // n0x0c18 c0x0000 (---------------) + I yokoze 0x0025c644, // n0x0c19 c0x0000 (---------------) + I yono 0x0020d805, // n0x0c1a c0x0000 (---------------) + I yorii 0x00262e07, // n0x0c1b c0x0000 (---------------) + I yoshida 0x00281c49, // n0x0c1c c0x0000 (---------------) + I yoshikawa 0x00287cc7, // n0x0c1d c0x0000 (---------------) + I yoshimi 0x00625ec4, // n0x0c1e c0x0001 (---------------) ! I city 0x00625ec4, // n0x0c1f c0x0001 (---------------) ! I city 0x002ea645, // n0x0c20 c0x0000 (---------------) + I aisho 0x002ed784, // n0x0c21 c0x0000 (---------------) + I gamo 0x0028038a, // n0x0c22 c0x0000 (---------------) + I higashiomi 0x00260906, // n0x0c23 c0x0000 (---------------) + I hikone 0x0024d2c4, // n0x0c24 c0x0000 (---------------) + I koka 0x002d9945, // n0x0c25 c0x0000 (---------------) + I konan 0x00292945, // n0x0c26 c0x0000 (---------------) + I kosei 0x002956c4, // n0x0c27 c0x0000 (---------------) + I koto 0x00268007, // n0x0c28 c0x0000 (---------------) + I kusatsu 0x00255547, // n0x0c29 c0x0000 (---------------) + I maibara 0x002af248, // n0x0c2a c0x0000 (---------------) + I moriyama 0x00344108, // n0x0c2b c0x0000 (---------------) + I nagahama 0x0021dbc9, // n0x0c2c c0x0000 (---------------) + I nishiazai 0x00239088, // n0x0c2d c0x0000 (---------------) + I notogawa 0x0028054b, // n0x0c2e c0x0000 (---------------) + I omihachiman 0x00227284, // n0x0c2f c0x0000 (---------------) + I otsu 0x002668c5, // n0x0c30 c0x0000 (---------------) + I ritto 0x002a05c5, // n0x0c31 c0x0000 (---------------) + I ryuoh 0x0029b489, // n0x0c32 c0x0000 (---------------) + I takashima 0x00267609, // n0x0c33 c0x0000 (---------------) + I takatsuki 0x002cf008, // n0x0c34 c0x0000 (---------------) + I torahime 0x00309248, // n0x0c35 c0x0000 (---------------) + I toyosato 0x0025e6c4, // n0x0c36 c0x0000 (---------------) + I yasu 0x00217b45, // n0x0c37 c0x0000 (---------------) + I akagi 0x0020b5c3, // n0x0c38 c0x0000 (---------------) + I ama 0x00227245, // n0x0c39 c0x0000 (---------------) + I gotsu 0x00287e86, // n0x0c3a c0x0000 (---------------) + I hamada 0x0027a94c, // n0x0c3b c0x0000 (---------------) + I higashiizumo 0x00279086, // n0x0c3c c0x0000 (---------------) + I hikawa 0x002dba86, // n0x0c3d c0x0000 (---------------) + I hikimi 0x00270a05, // n0x0c3e c0x0000 (---------------) + I izumo 0x002d5008, // n0x0c3f c0x0000 (---------------) + I kakinoki 0x002b1fc6, // n0x0c40 c0x0000 (---------------) + I masuda 0x00307086, // n0x0c41 c0x0000 (---------------) + I matsue 0x00279206, // n0x0c42 c0x0000 (---------------) + I misato 0x002284cc, // n0x0c43 c0x0000 (---------------) + I nishinoshima 0x00257f04, // n0x0c44 c0x0000 (---------------) + I ohda 0x003097ca, // n0x0c45 c0x0000 (---------------) + I okinoshima 0x00270948, // n0x0c46 c0x0000 (---------------) + I okuizumo 0x0027a787, // n0x0c47 c0x0000 (---------------) + I shimane 0x00342306, // n0x0c48 c0x0000 (---------------) + I tamayu 0x0024f4c7, // n0x0c49 c0x0000 (---------------) + I tsuwano 0x002c41c5, // n0x0c4a c0x0000 (---------------) + I unnan 0x00286586, // n0x0c4b c0x0000 (---------------) + I yakumo 0x0030e706, // n0x0c4c c0x0000 (---------------) + I yasugi 0x00316047, // n0x0c4d c0x0000 (---------------) + I yatsuka 0x0028e6c4, // n0x0c4e c0x0000 (---------------) + I arai 0x002d8dc5, // n0x0c4f c0x0000 (---------------) + I atami 0x00260404, // n0x0c50 c0x0000 (---------------) + I fuji 0x002cda87, // n0x0c51 c0x0000 (---------------) + I fujieda 0x00260648, // n0x0c52 c0x0000 (---------------) + I fujikawa 0x00260dca, // n0x0c53 c0x0000 (---------------) + I fujinomiya 0x00265107, // n0x0c54 c0x0000 (---------------) + I fukuroi 0x00225a47, // n0x0c55 c0x0000 (---------------) + I gotemba 0x00329207, // n0x0c56 c0x0000 (---------------) + I haibara 0x00224809, // n0x0c57 c0x0000 (---------------) + I hamamatsu 0x0027a94a, // n0x0c58 c0x0000 (---------------) + I higashiizu 0x0020ac43, // n0x0c59 c0x0000 (---------------) + I ito 0x0028f585, // n0x0c5a c0x0000 (---------------) + I iwata 0x00201183, // n0x0c5b c0x0000 (---------------) + I izu 0x002ad389, // n0x0c5c c0x0000 (---------------) + I izunokuni 0x00263388, // n0x0c5d c0x0000 (---------------) + I kakegawa 0x002d1fc7, // n0x0c5e c0x0000 (---------------) + I kannami 0x002a8649, // n0x0c5f c0x0000 (---------------) + I kawanehon 0x002a2d86, // n0x0c60 c0x0000 (---------------) + I kawazu 0x002007c8, // n0x0c61 c0x0000 (---------------) + I kikugawa 0x00290b85, // n0x0c62 c0x0000 (---------------) + I kosai 0x0026cdca, // n0x0c63 c0x0000 (---------------) + I makinohara 0x002af3c9, // n0x0c64 c0x0000 (---------------) + I matsuzaki 0x0023cdc9, // n0x0c65 c0x0000 (---------------) + I minamiizu 0x002d6fc7, // n0x0c66 c0x0000 (---------------) + I mishima 0x00276ec9, // n0x0c67 c0x0000 (---------------) + I morimachi 0x0025db48, // n0x0c68 c0x0000 (---------------) + I nishiizu 0x002e5706, // n0x0c69 c0x0000 (---------------) + I numazu 0x0022b488, // n0x0c6a c0x0000 (---------------) + I omaezaki 0x0022fd87, // n0x0c6b c0x0000 (---------------) + I shimada 0x0022a207, // n0x0c6c c0x0000 (---------------) + I shimizu 0x002508c7, // n0x0c6d c0x0000 (---------------) + I shimoda 0x002d1e48, // n0x0c6e c0x0000 (---------------) + I shizuoka 0x002ce2c6, // n0x0c6f c0x0000 (---------------) + I susono 0x0028edc5, // n0x0c70 c0x0000 (---------------) + I yaizu 0x00262e07, // n0x0c71 c0x0000 (---------------) + I yoshida 0x0027b208, // n0x0c72 c0x0000 (---------------) + I ashikaga 0x0032df44, // n0x0c73 c0x0000 (---------------) + I bato 0x00312b04, // n0x0c74 c0x0000 (---------------) + I haga 0x002d6307, // n0x0c75 c0x0000 (---------------) + I ichikai 0x0030cb07, // n0x0c76 c0x0000 (---------------) + I iwafune 0x00200d8a, // n0x0c77 c0x0000 (---------------) + I kaminokawa 0x002e5686, // n0x0c78 c0x0000 (---------------) + I kanuma 0x0031130a, // n0x0c79 c0x0000 (---------------) + I karasuyama 0x0029f547, // n0x0c7a c0x0000 (---------------) + I kuroiso 0x002f84c7, // n0x0c7b c0x0000 (---------------) + I mashiko 0x00299804, // n0x0c7c c0x0000 (---------------) + I mibu 0x00321404, // n0x0c7d c0x0000 (---------------) + I moka 0x0021fa06, // n0x0c7e c0x0000 (---------------) + I motegi 0x002f7a44, // n0x0c7f c0x0000 (---------------) + I nasu 0x002f7a4c, // n0x0c80 c0x0000 (---------------) + I nasushiobara 0x00213a05, // n0x0c81 c0x0000 (---------------) + I nikko 0x0027ca49, // n0x0c82 c0x0000 (---------------) + I nishikata 0x0030fa44, // n0x0c83 c0x0000 (---------------) + I nogi 0x00295785, // n0x0c84 c0x0000 (---------------) + I ohira 0x0020a588, // n0x0c85 c0x0000 (---------------) + I ohtawara 0x0020b545, // n0x0c86 c0x0000 (---------------) + I oyama 0x002a2746, // n0x0c87 c0x0000 (---------------) + I sakura 0x00276004, // n0x0c88 c0x0000 (---------------) + I sano 0x002c86ca, // n0x0c89 c0x0000 (---------------) + I shimotsuke 0x002cdc46, // n0x0c8a c0x0000 (---------------) + I shioya 0x0028170a, // n0x0c8b c0x0000 (---------------) + I takanezawa 0x0032dfc7, // n0x0c8c c0x0000 (---------------) + I tochigi 0x00294645, // n0x0c8d c0x0000 (---------------) + I tsuga 0x00218485, // n0x0c8e c0x0000 (---------------) + I ujiie 0x0026a78a, // n0x0c8f c0x0000 (---------------) + I utsunomiya 0x0025efc5, // n0x0c90 c0x0000 (---------------) + I yaita 0x00284786, // n0x0c91 c0x0000 (---------------) + I aizumi 0x002a2f44, // n0x0c92 c0x0000 (---------------) + I anan 0x0029c146, // n0x0c93 c0x0000 (---------------) + I ichiba 0x0031a7c5, // n0x0c94 c0x0000 (---------------) + I itano 0x002215c6, // n0x0c95 c0x0000 (---------------) + I kainan 0x002b1d4c, // n0x0c96 c0x0000 (---------------) + I komatsushima 0x0029b64a, // n0x0c97 c0x0000 (---------------) + I matsushige 0x0023f744, // n0x0c98 c0x0000 (---------------) + I mima 0x0020aa46, // n0x0c99 c0x0000 (---------------) + I minami 0x00281bc7, // n0x0c9a c0x0000 (---------------) + I miyoshi 0x002b2344, // n0x0c9b c0x0000 (---------------) + I mugi 0x002a1cc8, // n0x0c9c c0x0000 (---------------) + I nakagawa 0x002fb646, // n0x0c9d c0x0000 (---------------) + I naruto 0x002b4b49, // n0x0c9e c0x0000 (---------------) + I sanagochi 0x002d0389, // n0x0c9f c0x0000 (---------------) + I shishikui 0x002ccac9, // n0x0ca0 c0x0000 (---------------) + I tokushima 0x0022a606, // n0x0ca1 c0x0000 (---------------) + I wajiki 0x0022fe86, // n0x0ca2 c0x0000 (---------------) + I adachi 0x0022b5c7, // n0x0ca3 c0x0000 (---------------) + I akiruno 0x002fa6c8, // n0x0ca4 c0x0000 (---------------) + I akishima 0x0022fc89, // n0x0ca5 c0x0000 (---------------) + I aogashima 0x0030edc7, // n0x0ca6 c0x0000 (---------------) + I arakawa 0x00233f86, // n0x0ca7 c0x0000 (---------------) + I bunkyo 0x00202907, // n0x0ca8 c0x0000 (---------------) + I chiyoda 0x00304245, // n0x0ca9 c0x0000 (---------------) + I chofu 0x002f8704, // n0x0caa c0x0000 (---------------) + I chuo 0x0022b187, // n0x0cab c0x0000 (---------------) + I edogawa 0x0032e185, // n0x0cac c0x0000 (---------------) + I fuchu 0x0026b605, // n0x0cad c0x0000 (---------------) + I fussa 0x00247947, // n0x0cae c0x0000 (---------------) + I hachijo 0x0028ebc8, // n0x0caf c0x0000 (---------------) + I hachioji 0x0026f686, // n0x0cb0 c0x0000 (---------------) + I hamura 0x0027d18d, // n0x0cb1 c0x0000 (---------------) + I higashikurume 0x0027e88f, // n0x0cb2 c0x0000 (---------------) + I higashimurayama 0x0028330d, // n0x0cb3 c0x0000 (---------------) + I higashiyamato 0x00200644, // n0x0cb4 c0x0000 (---------------) + I hino 0x002357c6, // n0x0cb5 c0x0000 (---------------) + I hinode 0x002b8ac8, // n0x0cb6 c0x0000 (---------------) + I hinohara 0x002ebcc5, // n0x0cb7 c0x0000 (---------------) + I inagi 0x0028d888, // n0x0cb8 c0x0000 (---------------) + I itabashi 0x002d280a, // n0x0cb9 c0x0000 (---------------) + I katsushika 0x0023a944, // n0x0cba c0x0000 (---------------) + I kita 0x00311646, // n0x0cbb c0x0000 (---------------) + I kiyose 0x002b2a47, // n0x0cbc c0x0000 (---------------) + I kodaira 0x002f2307, // n0x0cbd c0x0000 (---------------) + I koganei 0x0021fc49, // n0x0cbe c0x0000 (---------------) + I kokubunji 0x0022b445, // n0x0cbf c0x0000 (---------------) + I komae 0x002956c4, // n0x0cc0 c0x0000 (---------------) + I koto 0x002970ca, // n0x0cc1 c0x0000 (---------------) + I kouzushima 0x0029cbc9, // n0x0cc2 c0x0000 (---------------) + I kunitachi 0x00276fc7, // n0x0cc3 c0x0000 (---------------) + I machida 0x002d1cc6, // n0x0cc4 c0x0000 (---------------) + I meguro 0x00306486, // n0x0cc5 c0x0000 (---------------) + I minato 0x00217a86, // n0x0cc6 c0x0000 (---------------) + I mitaka 0x00239606, // n0x0cc7 c0x0000 (---------------) + I mizuho 0x002b85cf, // n0x0cc8 c0x0000 (---------------) + I musashimurayama 0x002b8989, // n0x0cc9 c0x0000 (---------------) + I musashino 0x0020ff86, // n0x0cca c0x0000 (---------------) + I nakano 0x00325646, // n0x0ccb c0x0000 (---------------) + I nerima 0x002fb0c9, // n0x0ccc c0x0000 (---------------) + I ogasawara 0x00295d07, // n0x0ccd c0x0000 (---------------) + I okutama 0x00211243, // n0x0cce c0x0000 (---------------) + I ome 0x00228646, // n0x0ccf c0x0000 (---------------) + I oshima 0x00213103, // n0x0cd0 c0x0000 (---------------) + I ota 0x003512c8, // n0x0cd1 c0x0000 (---------------) + I setagaya 0x00294dc7, // n0x0cd2 c0x0000 (---------------) + I shibuya 0x00285249, // n0x0cd3 c0x0000 (---------------) + I shinagawa 0x002ca0c8, // n0x0cd4 c0x0000 (---------------) + I shinjuku 0x002a7648, // n0x0cd5 c0x0000 (---------------) + I suginami 0x0027bf46, // n0x0cd6 c0x0000 (---------------) + I sumida 0x00292489, // n0x0cd7 c0x0000 (---------------) + I tachikawa 0x00238685, // n0x0cd8 c0x0000 (---------------) + I taito 0x00295dc4, // n0x0cd9 c0x0000 (---------------) + I tama 0x002b9f07, // n0x0cda c0x0000 (---------------) + I toshima 0x00251f45, // n0x0cdb c0x0000 (---------------) + I chizu 0x00200644, // n0x0cdc c0x0000 (---------------) + I hino 0x0026b248, // n0x0cdd c0x0000 (---------------) + I kawahara 0x00205e44, // n0x0cde c0x0000 (---------------) + I koge 0x00295a47, // n0x0cdf c0x0000 (---------------) + I kotoura 0x002ba546, // n0x0ce0 c0x0000 (---------------) + I misasa 0x0024fa45, // n0x0ce1 c0x0000 (---------------) + I nanbu 0x002c8fc8, // n0x0ce2 c0x0000 (---------------) + I nichinan 0x0030634b, // n0x0ce3 c0x0000 (---------------) + I sakaiminato 0x0031ddc7, // n0x0ce4 c0x0000 (---------------) + I tottori 0x0026aa06, // n0x0ce5 c0x0000 (---------------) + I wakasa 0x002ab904, // n0x0ce6 c0x0000 (---------------) + I yazu 0x002052c6, // n0x0ce7 c0x0000 (---------------) + I yonago 0x002a5e85, // n0x0ce8 c0x0000 (---------------) + I asahi 0x0032e185, // n0x0ce9 c0x0000 (---------------) + I fuchu 0x00264909, // n0x0cea c0x0000 (---------------) + I fukumitsu 0x00267c09, // n0x0ceb c0x0000 (---------------) + I funahashi 0x0022a244, // n0x0cec c0x0000 (---------------) + I himi 0x0022a285, // n0x0ced c0x0000 (---------------) + I imizu 0x0020aa85, // n0x0cee c0x0000 (---------------) + I inami 0x0026cc46, // n0x0cef c0x0000 (---------------) + I johana 0x002d6208, // n0x0cf0 c0x0000 (---------------) + I kamiichi 0x0029e686, // n0x0cf1 c0x0000 (---------------) + I kurobe 0x0028250b, // n0x0cf2 c0x0000 (---------------) + I nakaniikawa 0x00318b4a, // n0x0cf3 c0x0000 (---------------) + I namerikawa 0x002940c5, // n0x0cf4 c0x0000 (---------------) + I nanto 0x002712c6, // n0x0cf5 c0x0000 (---------------) + I nyuzen 0x002ffb45, // n0x0cf6 c0x0000 (---------------) + I oyabe 0x00204f45, // n0x0cf7 c0x0000 (---------------) + I taira 0x002c9407, // n0x0cf8 c0x0000 (---------------) + I takaoka 0x00231e48, // n0x0cf9 c0x0000 (---------------) + I tateyama 0x00239104, // n0x0cfa c0x0000 (---------------) + I toga 0x00299706, // n0x0cfb c0x0000 (---------------) + I tonami 0x00218dc6, // n0x0cfc c0x0000 (---------------) + I toyama 0x0025dd07, // n0x0cfd c0x0000 (---------------) + I unazuki 0x002fc904, // n0x0cfe c0x0000 (---------------) + I uozu 0x002638c6, // n0x0cff c0x0000 (---------------) + I yamada 0x0021b8c5, // n0x0d00 c0x0000 (---------------) + I arida 0x0021b8c9, // n0x0d01 c0x0000 (---------------) + I aridagawa 0x00230084, // n0x0d02 c0x0000 (---------------) + I gobo 0x002ca749, // n0x0d03 c0x0000 (---------------) + I hashimoto 0x002623c6, // n0x0d04 c0x0000 (---------------) + I hidaka 0x002a1508, // n0x0d05 c0x0000 (---------------) + I hirogawa 0x0020aa85, // n0x0d06 c0x0000 (---------------) + I inami 0x0023e3c5, // n0x0d07 c0x0000 (---------------) + I iwade 0x002215c6, // n0x0d08 c0x0000 (---------------) + I kainan 0x002afc89, // n0x0d09 c0x0000 (---------------) + I kamitonda 0x0028a1c9, // n0x0d0a c0x0000 (---------------) + I katsuragi 0x002dbb06, // n0x0d0b c0x0000 (---------------) + I kimino 0x00265808, // n0x0d0c c0x0000 (---------------) + I kinokawa 0x0024d588, // n0x0d0d c0x0000 (---------------) + I kitayama 0x002ffb04, // n0x0d0e c0x0000 (---------------) + I koya 0x00297bc4, // n0x0d0f c0x0000 (---------------) + I koza 0x00297bc8, // n0x0d10 c0x0000 (---------------) + I kozagawa 0x002f2f88, // n0x0d11 c0x0000 (---------------) + I kudoyama 0x002c1b89, // n0x0d12 c0x0000 (---------------) + I kushimoto 0x00287e06, // n0x0d13 c0x0000 (---------------) + I mihama 0x00279206, // n0x0d14 c0x0000 (---------------) + I misato 0x002efecd, // n0x0d15 c0x0000 (---------------) + I nachikatsuura 0x002c8bc6, // n0x0d16 c0x0000 (---------------) + I shingu 0x002cdf09, // n0x0d17 c0x0000 (---------------) + I shirahama 0x002deac5, // n0x0d18 c0x0000 (---------------) + I taiji 0x0031ca06, // n0x0d19 c0x0000 (---------------) + I tanabe 0x00291608, // n0x0d1a c0x0000 (---------------) + I wakayama 0x002ee205, // n0x0d1b c0x0000 (---------------) + I yuasa 0x002a6104, // n0x0d1c c0x0000 (---------------) + I yura 0x002a5e85, // n0x0d1d c0x0000 (---------------) + I asahi 0x00266fc8, // n0x0d1e c0x0000 (---------------) + I funagata 0x00280149, // n0x0d1f c0x0000 (---------------) + I higashine 0x002604c4, // n0x0d20 c0x0000 (---------------) + I iide 0x002a9786, // n0x0d21 c0x0000 (---------------) + I kahoku 0x0020b40a, // n0x0d22 c0x0000 (---------------) + I kaminoyama 0x002cd488, // n0x0d23 c0x0000 (---------------) + I kaneyama 0x00200f09, // n0x0d24 c0x0000 (---------------) + I kawanishi 0x0033e44a, // n0x0d25 c0x0000 (---------------) + I mamurogawa 0x002a85c6, // n0x0d26 c0x0000 (---------------) + I mikawa 0x0027ea48, // n0x0d27 c0x0000 (---------------) + I murayama 0x00344605, // n0x0d28 c0x0000 (---------------) + I nagai 0x002d4688, // n0x0d29 c0x0000 (---------------) + I nakayama 0x0029bf85, // n0x0d2a c0x0000 (---------------) + I nanyo 0x002a2c49, // n0x0d2b c0x0000 (---------------) + I nishikawa 0x002f87c9, // n0x0d2c c0x0000 (---------------) + I obanazawa 0x002071c2, // n0x0d2d c0x0000 (---------------) + I oe 0x00247f45, // n0x0d2e c0x0000 (---------------) + I oguni 0x00260c46, // n0x0d2f c0x0000 (---------------) + I ohkura 0x00262307, // n0x0d30 c0x0000 (---------------) + I oishida 0x00259b05, // n0x0d31 c0x0000 (---------------) + I sagae 0x00267506, // n0x0d32 c0x0000 (---------------) + I sakata 0x002ee2c8, // n0x0d33 c0x0000 (---------------) + I sakegawa 0x002c91c6, // n0x0d34 c0x0000 (---------------) + I shinjo 0x002cfd49, // n0x0d35 c0x0000 (---------------) + I shirataka 0x002619c6, // n0x0d36 c0x0000 (---------------) + I shonai 0x00329548, // n0x0d37 c0x0000 (---------------) + I takahata 0x0028b585, // n0x0d38 c0x0000 (---------------) + I tendo 0x0028c546, // n0x0d39 c0x0000 (---------------) + I tozawa 0x00207248, // n0x0d3a c0x0000 (---------------) + I tsuruoka 0x00266548, // n0x0d3b c0x0000 (---------------) + I yamagata 0x0020b808, // n0x0d3c c0x0000 (---------------) + I yamanobe 0x00258648, // n0x0d3d c0x0000 (---------------) + I yonezawa 0x002237c4, // n0x0d3e c0x0000 (---------------) + I yuza 0x00223903, // n0x0d3f c0x0000 (---------------) + I abu 0x002cff84, // n0x0d40 c0x0000 (---------------) + I hagi 0x002cc386, // n0x0d41 c0x0000 (---------------) + I hikari 0x00304284, // n0x0d42 c0x0000 (---------------) + I hofu 0x00336347, // n0x0d43 c0x0000 (---------------) + I iwakuni 0x00306f89, // n0x0d44 c0x0000 (---------------) + I kudamatsu 0x002aad85, // n0x0d45 c0x0000 (---------------) + I mitou 0x0021a286, // n0x0d46 c0x0000 (---------------) + I nagato 0x00228646, // n0x0d47 c0x0000 (---------------) + I oshima 0x002c7c0b, // n0x0d48 c0x0000 (---------------) + I shimonoseki 0x00294006, // n0x0d49 c0x0000 (---------------) + I shunan 0x002f3286, // n0x0d4a c0x0000 (---------------) + I tabuse 0x002f1d88, // n0x0d4b c0x0000 (---------------) + I tokuyama 0x0026fc46, // n0x0d4c c0x0000 (---------------) + I toyota 0x00248dc3, // n0x0d4d c0x0000 (---------------) + I ube 0x00223583, // n0x0d4e c0x0000 (---------------) + I yuu 0x002f8704, // n0x0d4f c0x0000 (---------------) + I chuo 0x00294d45, // n0x0d50 c0x0000 (---------------) + I doshi 0x00265547, // n0x0d51 c0x0000 (---------------) + I fuefuki 0x00260648, // n0x0d52 c0x0000 (---------------) + I fujikawa 0x0026064f, // n0x0d53 c0x0000 (---------------) + I fujikawaguchiko 0x00262d0b, // n0x0d54 c0x0000 (---------------) + I fujiyoshida 0x002d6008, // n0x0d55 c0x0000 (---------------) + I hayakawa 0x002a9806, // n0x0d56 c0x0000 (---------------) + I hokuto 0x0027900e, // n0x0d57 c0x0000 (---------------) + I ichikawamisato 0x002215c3, // n0x0d58 c0x0000 (---------------) + I kai 0x002fce44, // n0x0d59 c0x0000 (---------------) + I kofu 0x00293f85, // n0x0d5a c0x0000 (---------------) + I koshu 0x00295546, // n0x0d5b c0x0000 (---------------) + I kosuge 0x0027384b, // n0x0d5c c0x0000 (---------------) + I minami-alps 0x00277746, // n0x0d5d c0x0000 (---------------) + I minobu 0x00229c09, // n0x0d5e c0x0000 (---------------) + I nakamichi 0x0024fa45, // n0x0d5f c0x0000 (---------------) + I nanbu 0x0034de48, // n0x0d60 c0x0000 (---------------) + I narusawa 0x00217f08, // n0x0d61 c0x0000 (---------------) + I nirasaki 0x0028a08c, // n0x0d62 c0x0000 (---------------) + I nishikatsura 0x00284086, // n0x0d63 c0x0000 (---------------) + I oshino 0x00227286, // n0x0d64 c0x0000 (---------------) + I otsuki 0x002d3145, // n0x0d65 c0x0000 (---------------) + I showa 0x0026ba48, // n0x0d66 c0x0000 (---------------) + I tabayama 0x00207245, // n0x0d67 c0x0000 (---------------) + I tsuru 0x00243608, // n0x0d68 c0x0000 (---------------) + I uenohara 0x0028374a, // n0x0d69 c0x0000 (---------------) + I yamanakako 0x00330b49, // n0x0d6a c0x0000 (---------------) + I yamanashi 0x00625ec4, // n0x0d6b c0x0001 (---------------) ! I city 0x002104c3, // n0x0d6c c0x0000 (---------------) + I com 0x002ceec3, // n0x0d6d c0x0000 (---------------) + I edu 0x002150c3, // n0x0d6e c0x0000 (---------------) + I gov 0x0025f683, // n0x0d6f c0x0000 (---------------) + I mil 0x00239bc3, // n0x0d70 c0x0000 (---------------) + I net 0x002453c3, // n0x0d71 c0x0000 (---------------) + I org 0x002b5183, // n0x0d72 c0x0000 (---------------) + I biz 0x002104c3, // n0x0d73 c0x0000 (---------------) + I com 0x002ceec3, // n0x0d74 c0x0000 (---------------) + I edu 0x002150c3, // n0x0d75 c0x0000 (---------------) + I gov 0x002180c4, // n0x0d76 c0x0000 (---------------) + I info 0x00239bc3, // n0x0d77 c0x0000 (---------------) + I net 0x002453c3, // n0x0d78 c0x0000 (---------------) + I org 0x00202f43, // n0x0d79 c0x0000 (---------------) + I ass 0x00202f44, // n0x0d7a c0x0000 (---------------) + I asso 0x002104c3, // n0x0d7b c0x0000 (---------------) + I com 0x00236044, // n0x0d7c c0x0000 (---------------) + I coop 0x002ceec3, // n0x0d7d c0x0000 (---------------) + I edu 0x0022fa44, // n0x0d7e c0x0000 (---------------) + I gouv 0x002150c3, // n0x0d7f c0x0000 (---------------) + I gov 0x002910c7, // n0x0d80 c0x0000 (---------------) + I medecin 0x0025f683, // n0x0d81 c0x0000 (---------------) + I mil 0x002006c3, // n0x0d82 c0x0000 (---------------) + I nom 0x00253e08, // n0x0d83 c0x0000 (---------------) + I notaires 0x002453c3, // n0x0d84 c0x0000 (---------------) + I org 0x002bb40b, // n0x0d85 c0x0000 (---------------) + I pharmaciens 0x00259843, // n0x0d86 c0x0000 (---------------) + I prd 0x0020e2c6, // n0x0d87 c0x0000 (---------------) + I presse 0x0023d502, // n0x0d88 c0x0000 (---------------) + I tm 0x002c670b, // n0x0d89 c0x0000 (---------------) + I veterinaire 0x002ceec3, // n0x0d8a c0x0000 (---------------) + I edu 0x002150c3, // n0x0d8b c0x0000 (---------------) + I gov 0x00239bc3, // n0x0d8c c0x0000 (---------------) + I net 0x002453c3, // n0x0d8d c0x0000 (---------------) + I org 0x002104c3, // n0x0d8e c0x0000 (---------------) + I com 0x002ceec3, // n0x0d8f c0x0000 (---------------) + I edu 0x002150c3, // n0x0d90 c0x0000 (---------------) + I gov 0x002453c3, // n0x0d91 c0x0000 (---------------) + I org 0x0023ba83, // n0x0d92 c0x0000 (---------------) + I rep 0x00209943, // n0x0d93 c0x0000 (---------------) + I tra 0x002028c2, // n0x0d94 c0x0000 (---------------) + I ac 0x00031c88, // n0x0d95 c0x0000 (---------------) + blogspot 0x0022f305, // n0x0d96 c0x0000 (---------------) + I busan 0x0031f988, // n0x0d97 c0x0000 (---------------) + I chungbuk 0x00324488, // n0x0d98 c0x0000 (---------------) + I chungnam 0x00208f82, // n0x0d99 c0x0000 (---------------) + I co 0x002ed2c5, // n0x0d9a c0x0000 (---------------) + I daegu 0x00224a47, // n0x0d9b c0x0000 (---------------) + I daejeon 0x002016c2, // n0x0d9c c0x0000 (---------------) + I es 0x00229e47, // n0x0d9d c0x0000 (---------------) + I gangwon 0x002053c2, // n0x0d9e c0x0000 (---------------) + I go 0x0025b8c7, // n0x0d9f c0x0000 (---------------) + I gwangju 0x002f3649, // n0x0da0 c0x0000 (---------------) + I gyeongbuk 0x00343cc8, // n0x0da1 c0x0000 (---------------) + I gyeonggi 0x00344bc9, // n0x0da2 c0x0000 (---------------) + I gyeongnam 0x00211c42, // n0x0da3 c0x0000 (---------------) + I hs 0x0024e907, // n0x0da4 c0x0000 (---------------) + I incheon 0x0031bb04, // n0x0da5 c0x0000 (---------------) + I jeju 0x00224b07, // n0x0da6 c0x0000 (---------------) + I jeonbuk 0x00318a47, // n0x0da7 c0x0000 (---------------) + I jeonnam 0x00243242, // n0x0da8 c0x0000 (---------------) + I kg 0x0025f683, // n0x0da9 c0x0000 (---------------) + I mil 0x00222fc2, // n0x0daa c0x0000 (---------------) + I ms 0x00205f42, // n0x0dab c0x0000 (---------------) + I ne 0x00204282, // n0x0dac c0x0000 (---------------) + I or 0x00208682, // n0x0dad c0x0000 (---------------) + I pe 0x00202142, // n0x0dae c0x0000 (---------------) + I re 0x00201e42, // n0x0daf c0x0000 (---------------) + I sc 0x002be645, // n0x0db0 c0x0000 (---------------) + I seoul 0x00223605, // n0x0db1 c0x0000 (---------------) + I ulsan 0x002104c3, // n0x0db2 c0x0000 (---------------) + I com 0x002ceec3, // n0x0db3 c0x0000 (---------------) + I edu 0x002150c3, // n0x0db4 c0x0000 (---------------) + I gov 0x00239bc3, // n0x0db5 c0x0000 (---------------) + I net 0x002453c3, // n0x0db6 c0x0000 (---------------) + I org 0x002104c3, // n0x0db7 c0x0000 (---------------) + I com 0x002ceec3, // n0x0db8 c0x0000 (---------------) + I edu 0x002150c3, // n0x0db9 c0x0000 (---------------) + I gov 0x0025f683, // n0x0dba c0x0000 (---------------) + I mil 0x00239bc3, // n0x0dbb c0x0000 (---------------) + I net 0x002453c3, // n0x0dbc c0x0000 (---------------) + I org 0x00000401, // n0x0dbd c0x0000 (---------------) + c 0x002104c3, // n0x0dbe c0x0000 (---------------) + I com 0x002ceec3, // n0x0dbf c0x0000 (---------------) + I edu 0x002150c3, // n0x0dc0 c0x0000 (---------------) + I gov 0x002180c4, // n0x0dc1 c0x0000 (---------------) + I info 0x0021fe43, // n0x0dc2 c0x0000 (---------------) + I int 0x00239bc3, // n0x0dc3 c0x0000 (---------------) + I net 0x002453c3, // n0x0dc4 c0x0000 (---------------) + I org 0x0020f983, // n0x0dc5 c0x0000 (---------------) + I per 0x002104c3, // n0x0dc6 c0x0000 (---------------) + I com 0x002ceec3, // n0x0dc7 c0x0000 (---------------) + I edu 0x002150c3, // n0x0dc8 c0x0000 (---------------) + I gov 0x00239bc3, // n0x0dc9 c0x0000 (---------------) + I net 0x002453c3, // n0x0dca c0x0000 (---------------) + I org 0x00208f82, // n0x0dcb c0x0000 (---------------) + I co 0x002104c3, // n0x0dcc c0x0000 (---------------) + I com 0x002ceec3, // n0x0dcd c0x0000 (---------------) + I edu 0x002150c3, // n0x0dce c0x0000 (---------------) + I gov 0x00239bc3, // n0x0dcf c0x0000 (---------------) + I net 0x002453c3, // n0x0dd0 c0x0000 (---------------) + I org 0x002a3984, // n0x0dd1 c0x0000 (---------------) + I assn 0x002104c3, // n0x0dd2 c0x0000 (---------------) + I com 0x002ceec3, // n0x0dd3 c0x0000 (---------------) + I edu 0x002150c3, // n0x0dd4 c0x0000 (---------------) + I gov 0x00243283, // n0x0dd5 c0x0000 (---------------) + I grp 0x0028ba85, // n0x0dd6 c0x0000 (---------------) + I hotel 0x0021fe43, // n0x0dd7 c0x0000 (---------------) + I int 0x00231743, // n0x0dd8 c0x0000 (---------------) + I ltd 0x00239bc3, // n0x0dd9 c0x0000 (---------------) + I net 0x00206ac3, // n0x0dda c0x0000 (---------------) + I ngo 0x002453c3, // n0x0ddb c0x0000 (---------------) + I org 0x00204343, // n0x0ddc c0x0000 (---------------) + I sch 0x002a3f83, // n0x0ddd c0x0000 (---------------) + I soc 0x00209243, // n0x0dde c0x0000 (---------------) + I web 0x002104c3, // n0x0ddf c0x0000 (---------------) + I com 0x002ceec3, // n0x0de0 c0x0000 (---------------) + I edu 0x002150c3, // n0x0de1 c0x0000 (---------------) + I gov 0x00239bc3, // n0x0de2 c0x0000 (---------------) + I net 0x002453c3, // n0x0de3 c0x0000 (---------------) + I org 0x00208f82, // n0x0de4 c0x0000 (---------------) + I co 0x002453c3, // n0x0de5 c0x0000 (---------------) + I org 0x002150c3, // n0x0de6 c0x0000 (---------------) + I gov 0x00299d43, // n0x0de7 c0x0000 (---------------) + I asn 0x002104c3, // n0x0de8 c0x0000 (---------------) + I com 0x00232044, // n0x0de9 c0x0000 (---------------) + I conf 0x002ceec3, // n0x0dea c0x0000 (---------------) + I edu 0x002150c3, // n0x0deb c0x0000 (---------------) + I gov 0x0020ab82, // n0x0dec c0x0000 (---------------) + I id 0x0025f683, // n0x0ded c0x0000 (---------------) + I mil 0x00239bc3, // n0x0dee c0x0000 (---------------) + I net 0x002453c3, // n0x0def c0x0000 (---------------) + I org 0x002104c3, // n0x0df0 c0x0000 (---------------) + I com 0x002ceec3, // n0x0df1 c0x0000 (---------------) + I edu 0x002150c3, // n0x0df2 c0x0000 (---------------) + I gov 0x0020ab82, // n0x0df3 c0x0000 (---------------) + I id 0x002382c3, // n0x0df4 c0x0000 (---------------) + I med 0x00239bc3, // n0x0df5 c0x0000 (---------------) + I net 0x002453c3, // n0x0df6 c0x0000 (---------------) + I org 0x002c1843, // n0x0df7 c0x0000 (---------------) + I plc 0x00204343, // n0x0df8 c0x0000 (---------------) + I sch 0x002028c2, // n0x0df9 c0x0000 (---------------) + I ac 0x00208f82, // n0x0dfa c0x0000 (---------------) + I co 0x002150c3, // n0x0dfb c0x0000 (---------------) + I gov 0x00239bc3, // n0x0dfc c0x0000 (---------------) + I net 0x002453c3, // n0x0dfd c0x0000 (---------------) + I org 0x0020e2c5, // n0x0dfe c0x0000 (---------------) + I press 0x00202f44, // n0x0dff c0x0000 (---------------) + I asso 0x0023d502, // n0x0e00 c0x0000 (---------------) + I tm 0x002028c2, // n0x0e01 c0x0000 (---------------) + I ac 0x00208f82, // n0x0e02 c0x0000 (---------------) + I co 0x002ceec3, // n0x0e03 c0x0000 (---------------) + I edu 0x002150c3, // n0x0e04 c0x0000 (---------------) + I gov 0x00238803, // n0x0e05 c0x0000 (---------------) + I its 0x00239bc3, // n0x0e06 c0x0000 (---------------) + I net 0x002453c3, // n0x0e07 c0x0000 (---------------) + I org 0x002c5804, // n0x0e08 c0x0000 (---------------) + I priv 0x002104c3, // n0x0e09 c0x0000 (---------------) + I com 0x002ceec3, // n0x0e0a c0x0000 (---------------) + I edu 0x002150c3, // n0x0e0b c0x0000 (---------------) + I gov 0x0025f683, // n0x0e0c c0x0000 (---------------) + I mil 0x002006c3, // n0x0e0d c0x0000 (---------------) + I nom 0x002453c3, // n0x0e0e c0x0000 (---------------) + I org 0x00259843, // n0x0e0f c0x0000 (---------------) + I prd 0x0023d502, // n0x0e10 c0x0000 (---------------) + I tm 0x002104c3, // n0x0e11 c0x0000 (---------------) + I com 0x002ceec3, // n0x0e12 c0x0000 (---------------) + I edu 0x002150c3, // n0x0e13 c0x0000 (---------------) + I gov 0x002180c3, // n0x0e14 c0x0000 (---------------) + I inf 0x002d16c4, // n0x0e15 c0x0000 (---------------) + I name 0x00239bc3, // n0x0e16 c0x0000 (---------------) + I net 0x002453c3, // n0x0e17 c0x0000 (---------------) + I org 0x002104c3, // n0x0e18 c0x0000 (---------------) + I com 0x002ceec3, // n0x0e19 c0x0000 (---------------) + I edu 0x0022fa44, // n0x0e1a c0x0000 (---------------) + I gouv 0x002150c3, // n0x0e1b c0x0000 (---------------) + I gov 0x00239bc3, // n0x0e1c c0x0000 (---------------) + I net 0x002453c3, // n0x0e1d c0x0000 (---------------) + I org 0x0020e2c6, // n0x0e1e c0x0000 (---------------) + I presse 0x002ceec3, // n0x0e1f c0x0000 (---------------) + I edu 0x002150c3, // n0x0e20 c0x0000 (---------------) + I gov 0x00016043, // n0x0e21 c0x0000 (---------------) + nyc 0x002453c3, // n0x0e22 c0x0000 (---------------) + I org 0x002104c3, // n0x0e23 c0x0000 (---------------) + I com 0x002ceec3, // n0x0e24 c0x0000 (---------------) + I edu 0x002150c3, // n0x0e25 c0x0000 (---------------) + I gov 0x00239bc3, // n0x0e26 c0x0000 (---------------) + I net 0x002453c3, // n0x0e27 c0x0000 (---------------) + I org 0x00031c88, // n0x0e28 c0x0000 (---------------) + blogspot 0x002150c3, // n0x0e29 c0x0000 (---------------) + I gov 0x002028c2, // n0x0e2a c0x0000 (---------------) + I ac 0x00208f82, // n0x0e2b c0x0000 (---------------) + I co 0x002104c3, // n0x0e2c c0x0000 (---------------) + I com 0x002150c3, // n0x0e2d c0x0000 (---------------) + I gov 0x00239bc3, // n0x0e2e c0x0000 (---------------) + I net 0x00204282, // n0x0e2f c0x0000 (---------------) + I or 0x002453c3, // n0x0e30 c0x0000 (---------------) + I org 0x00352bc7, // n0x0e31 c0x0000 (---------------) + I academy 0x0020638b, // n0x0e32 c0x0000 (---------------) + I agriculture 0x00204f83, // n0x0e33 c0x0000 (---------------) + I air 0x002dbe08, // n0x0e34 c0x0000 (---------------) + I airguard 0x002fa447, // n0x0e35 c0x0000 (---------------) + I alabama 0x00203306, // n0x0e36 c0x0000 (---------------) + I alaska 0x002a4dc5, // n0x0e37 c0x0000 (---------------) + I amber 0x002066c9, // n0x0e38 c0x0000 (---------------) + I ambulance 0x0033f748, // n0x0e39 c0x0000 (---------------) + I american 0x0033f749, // n0x0e3a c0x0000 (---------------) + I americana 0x0033f750, // n0x0e3b c0x0000 (---------------) + I americanantiques 0x0034524b, // n0x0e3c c0x0000 (---------------) + I americanart 0x002a4c09, // n0x0e3d c0x0000 (---------------) + I amsterdam 0x00200a83, // n0x0e3e c0x0000 (---------------) + I and 0x00237d09, // n0x0e3f c0x0000 (---------------) + I annefrank 0x00233606, // n0x0e40 c0x0000 (---------------) + I anthro 0x0023360c, // n0x0e41 c0x0000 (---------------) + I anthropology 0x0022f3c8, // n0x0e42 c0x0000 (---------------) + I antiques 0x00269748, // n0x0e43 c0x0000 (---------------) + I aquarium 0x00307489, // n0x0e44 c0x0000 (---------------) + I arboretum 0x002c32ce, // n0x0e45 c0x0000 (---------------) + I archaeological 0x0032b34b, // n0x0e46 c0x0000 (---------------) + I archaeology 0x00240b4c, // n0x0e47 c0x0000 (---------------) + I architecture 0x0020c703, // n0x0e48 c0x0000 (---------------) + I art 0x0034544c, // n0x0e49 c0x0000 (---------------) + I artanddesign 0x002ec609, // n0x0e4a c0x0000 (---------------) + I artcenter 0x0020c707, // n0x0e4b c0x0000 (---------------) + I artdeco 0x0031974c, // n0x0e4c c0x0000 (---------------) + I arteducation 0x00234b8a, // n0x0e4d c0x0000 (---------------) + I artgallery 0x0023fec4, // n0x0e4e c0x0000 (---------------) + I arts 0x002a244d, // n0x0e4f c0x0000 (---------------) + I artsandcrafts 0x002ec4c8, // n0x0e50 c0x0000 (---------------) + I asmatart 0x0020894d, // n0x0e51 c0x0000 (---------------) + I assassination 0x002059c6, // n0x0e52 c0x0000 (---------------) + I assisi 0x002bae4b, // n0x0e53 c0x0000 (---------------) + I association 0x00224509, // n0x0e54 c0x0000 (---------------) + I astronomy 0x002da347, // n0x0e55 c0x0000 (---------------) + I atlanta 0x002f7f46, // n0x0e56 c0x0000 (---------------) + I austin 0x00224309, // n0x0e57 c0x0000 (---------------) + I australia 0x002eb24a, // n0x0e58 c0x0000 (---------------) + I automotive 0x002262c8, // n0x0e59 c0x0000 (---------------) + I aviation 0x0023bf44, // n0x0e5a c0x0000 (---------------) + I axis 0x002bfd47, // n0x0e5b c0x0000 (---------------) + I badajoz 0x00295007, // n0x0e5c c0x0000 (---------------) + I baghdad 0x00292844, // n0x0e5d c0x0000 (---------------) + I bahn 0x002ed404, // n0x0e5e c0x0000 (---------------) + I bale 0x002d8589, // n0x0e5f c0x0000 (---------------) + I baltimore 0x002e9ac9, // n0x0e60 c0x0000 (---------------) + I barcelona 0x0028bd08, // n0x0e61 c0x0000 (---------------) + I baseball 0x00318285, // n0x0e62 c0x0000 (---------------) + I basel 0x00211b85, // n0x0e63 c0x0000 (---------------) + I baths 0x00272c46, // n0x0e64 c0x0000 (---------------) + I bauern 0x002a2309, // n0x0e65 c0x0000 (---------------) + I beauxarts 0x0020b98d, // n0x0e66 c0x0000 (---------------) + I beeldengeluid 0x00269e48, // n0x0e67 c0x0000 (---------------) + I bellevue 0x00272b47, // n0x0e68 c0x0000 (---------------) + I bergbau 0x002a4e48, // n0x0e69 c0x0000 (---------------) + I berkeley 0x003414c6, // n0x0e6a c0x0000 (---------------) + I berlin 0x003421c4, // n0x0e6b c0x0000 (---------------) + I bern 0x0022b905, // n0x0e6c c0x0000 (---------------) + I bible 0x00205646, // n0x0e6d c0x0000 (---------------) + I bilbao 0x002097c4, // n0x0e6e c0x0000 (---------------) + I bill 0x0020c607, // n0x0e6f c0x0000 (---------------) + I birdart 0x0020db8a, // n0x0e70 c0x0000 (---------------) + I birthplace 0x00212184, // n0x0e71 c0x0000 (---------------) + I bonn 0x00212a46, // n0x0e72 c0x0000 (---------------) + I boston 0x002130c9, // n0x0e73 c0x0000 (---------------) + I botanical 0x002130cf, // n0x0e74 c0x0000 (---------------) + I botanicalgarden 0x0021534d, // n0x0e75 c0x0000 (---------------) + I botanicgarden 0x00215f46, // n0x0e76 c0x0000 (---------------) + I botany 0x002185d0, // n0x0e77 c0x0000 (---------------) + I brandywinevalley 0x00219206, // n0x0e78 c0x0000 (---------------) + I brasil 0x0021ab87, // n0x0e79 c0x0000 (---------------) + I bristol 0x0021c547, // n0x0e7a c0x0000 (---------------) + I british 0x0021d38f, // n0x0e7b c0x0000 (---------------) + I britishcolumbia 0x0021e009, // n0x0e7c c0x0000 (---------------) + I broadcast 0x00220ec6, // n0x0e7d c0x0000 (---------------) + I brunel 0x00222007, // n0x0e7e c0x0000 (---------------) + I brussel 0x00222008, // n0x0e7f c0x0000 (---------------) + I brussels 0x002226c9, // n0x0e80 c0x0000 (---------------) + I bruxelles 0x00349948, // n0x0e81 c0x0000 (---------------) + I building 0x002bf047, // n0x0e82 c0x0000 (---------------) + I burghof 0x0022f303, // n0x0e83 c0x0000 (---------------) + I bus 0x002774c6, // n0x0e84 c0x0000 (---------------) + I bushey 0x002c0188, // n0x0e85 c0x0000 (---------------) + I cadaques 0x002f930a, // n0x0e86 c0x0000 (---------------) + I california 0x0024b909, // n0x0e87 c0x0000 (---------------) + I cambridge 0x00246283, // n0x0e88 c0x0000 (---------------) + I can 0x0029d846, // n0x0e89 c0x0000 (---------------) + I canada 0x0029954a, // n0x0e8a c0x0000 (---------------) + I capebreton 0x002253c7, // n0x0e8b c0x0000 (---------------) + I carrier 0x0031958a, // n0x0e8c c0x0000 (---------------) + I cartoonart 0x00351e0e, // n0x0e8d c0x0000 (---------------) + I casadelamoneda 0x0021e146, // n0x0e8e c0x0000 (---------------) + I castle 0x00338507, // n0x0e8f c0x0000 (---------------) + I castres 0x002a2a06, // n0x0e90 c0x0000 (---------------) + I celtic 0x0023c546, // n0x0e91 c0x0000 (---------------) + I center 0x0025490b, // n0x0e92 c0x0000 (---------------) + I chattanooga 0x00258dca, // n0x0e93 c0x0000 (---------------) + I cheltenham 0x002411cd, // n0x0e94 c0x0000 (---------------) + I chesapeakebay 0x0022ff47, // n0x0e95 c0x0000 (---------------) + I chicago 0x00230648, // n0x0e96 c0x0000 (---------------) + I children 0x00230649, // n0x0e97 c0x0000 (---------------) + I childrens 0x0023064f, // n0x0e98 c0x0000 (---------------) + I childrensgarden 0x0028aa8c, // n0x0e99 c0x0000 (---------------) + I chiropractic 0x002d2489, // n0x0e9a c0x0000 (---------------) + I chocolate 0x0033324e, // n0x0e9b c0x0000 (---------------) + I christiansburg 0x002cb48a, // n0x0e9c c0x0000 (---------------) + I cincinnati 0x002911c6, // n0x0e9d c0x0000 (---------------) + I cinema 0x0034ca46, // n0x0e9e c0x0000 (---------------) + I circus 0x00226c8c, // n0x0e9f c0x0000 (---------------) + I civilisation 0x0022820c, // n0x0ea0 c0x0000 (---------------) + I civilization 0x002287c8, // n0x0ea1 c0x0000 (---------------) + I civilwar 0x00229007, // n0x0ea2 c0x0000 (---------------) + I clinton 0x00200b45, // n0x0ea3 c0x0000 (---------------) + I clock 0x0020c844, // n0x0ea4 c0x0000 (---------------) + I coal 0x00316a8e, // n0x0ea5 c0x0000 (---------------) + I coastaldefence 0x00278a44, // n0x0ea6 c0x0000 (---------------) + I cody 0x0024c087, // n0x0ea7 c0x0000 (---------------) + I coldwar 0x0024580a, // n0x0ea8 c0x0000 (---------------) + I collection 0x00239ed4, // n0x0ea9 c0x0000 (---------------) + I colonialwilliamsburg 0x0022e00f, // n0x0eaa c0x0000 (---------------) + I coloradoplateau 0x0021d548, // n0x0eab c0x0000 (---------------) + I columbia 0x0022f1c8, // n0x0eac c0x0000 (---------------) + I columbus 0x00214a0d, // n0x0ead c0x0000 (---------------) + I communication 0x00214a0e, // n0x0eae c0x0000 (---------------) + I communications 0x00296d09, // n0x0eaf c0x0000 (---------------) + I community 0x00230e88, // n0x0eb0 c0x0000 (---------------) + I computer 0x00230e8f, // n0x0eb1 c0x0000 (---------------) + I computerhistory 0x0023488c, // n0x0eb2 c0x0000 (---------------) + I contemporary 0x0023488f, // n0x0eb3 c0x0000 (---------------) + I contemporaryart 0x00235507, // n0x0eb4 c0x0000 (---------------) + I convent 0x0023654a, // n0x0eb5 c0x0000 (---------------) + I copenhagen 0x0023750b, // n0x0eb6 c0x0000 (---------------) + I corporation 0x002377c8, // n0x0eb7 c0x0000 (---------------) + I corvette 0x00238187, // n0x0eb8 c0x0000 (---------------) + I costume 0x0026ee0d, // n0x0eb9 c0x0000 (---------------) + I countryestate 0x00238b46, // n0x0eba c0x0000 (---------------) + I county 0x002a2606, // n0x0ebb c0x0000 (---------------) + I crafts 0x00239289, // n0x0ebc c0x0000 (---------------) + I cranbrook 0x002f9d48, // n0x0ebd c0x0000 (---------------) + I creation 0x0023c348, // n0x0ebe c0x0000 (---------------) + I cultural 0x0023c34e, // n0x0ebf c0x0000 (---------------) + I culturalcenter 0x00206487, // n0x0ec0 c0x0000 (---------------) + I culture 0x002bb985, // n0x0ec1 c0x0000 (---------------) + I cyber 0x0023d305, // n0x0ec2 c0x0000 (---------------) + I cymru 0x00236a04, // n0x0ec3 c0x0000 (---------------) + I dali 0x00259e46, // n0x0ec4 c0x0000 (---------------) + I dallas 0x0028bc08, // n0x0ec5 c0x0000 (---------------) + I database 0x00298f03, // n0x0ec6 c0x0000 (---------------) + I ddr 0x0025428e, // n0x0ec7 c0x0000 (---------------) + I decorativearts 0x0026f1c8, // n0x0ec8 c0x0000 (---------------) + I delaware 0x0026274b, // n0x0ec9 c0x0000 (---------------) + I delmenhorst 0x002f8b87, // n0x0eca c0x0000 (---------------) + I denmark 0x0023e485, // n0x0ecb c0x0000 (---------------) + I depot 0x00252b46, // n0x0ecc c0x0000 (---------------) + I design 0x0028c3c7, // n0x0ecd c0x0000 (---------------) + I detroit 0x002c7788, // n0x0ece c0x0000 (---------------) + I dinosaur 0x002a7189, // n0x0ecf c0x0000 (---------------) + I discovery 0x0026a545, // n0x0ed0 c0x0000 (---------------) + I dolls 0x0026af48, // n0x0ed1 c0x0000 (---------------) + I donostia 0x002df786, // n0x0ed2 c0x0000 (---------------) + I durham 0x0026e8ca, // n0x0ed3 c0x0000 (---------------) + I eastafrica 0x00316989, // n0x0ed4 c0x0000 (---------------) + I eastcoast 0x00319809, // n0x0ed5 c0x0000 (---------------) + I education 0x0031980b, // n0x0ed6 c0x0000 (---------------) + I educational 0x0031c3c8, // n0x0ed7 c0x0000 (---------------) + I egyptian 0x00292709, // n0x0ed8 c0x0000 (---------------) + I eisenbahn 0x00318346, // n0x0ed9 c0x0000 (---------------) + I elburg 0x0034f30a, // n0x0eda c0x0000 (---------------) + I elvendrell 0x00318e0a, // n0x0edb c0x0000 (---------------) + I embroidery 0x003192cc, // n0x0edc c0x0000 (---------------) + I encyclopedic 0x002a8fc7, // n0x0edd c0x0000 (---------------) + I england 0x00343aca, // n0x0ede c0x0000 (---------------) + I entomology 0x0021340b, // n0x0edf c0x0000 (---------------) + I environment 0x00213419, // n0x0ee0 c0x0000 (---------------) + I environmentalconservation 0x0033f248, // n0x0ee1 c0x0000 (---------------) + I epilepsy 0x0020e345, // n0x0ee2 c0x0000 (---------------) + I essex 0x0026efc6, // n0x0ee3 c0x0000 (---------------) + I estate 0x002fba49, // n0x0ee4 c0x0000 (---------------) + I ethnology 0x00201346, // n0x0ee5 c0x0000 (---------------) + I exeter 0x0020ddca, // n0x0ee6 c0x0000 (---------------) + I exhibition 0x00308946, // n0x0ee7 c0x0000 (---------------) + I family 0x00223e04, // n0x0ee8 c0x0000 (---------------) + I farm 0x0033788d, // n0x0ee9 c0x0000 (---------------) + I farmequipment 0x00223e07, // n0x0eea c0x0000 (---------------) + I farmers 0x0022d609, // n0x0eeb c0x0000 (---------------) + I farmstead 0x0023dbc5, // n0x0eec c0x0000 (---------------) + I field 0x0023dd08, // n0x0eed c0x0000 (---------------) + I figueres 0x0023f349, // n0x0eee c0x0000 (---------------) + I filatelia 0x0023f584, // n0x0eef c0x0000 (---------------) + I film 0x0023fdc7, // n0x0ef0 c0x0000 (---------------) + I fineart 0x0023fdc8, // n0x0ef1 c0x0000 (---------------) + I finearts 0x00240187, // n0x0ef2 c0x0000 (---------------) + I finland 0x00325b48, // n0x0ef3 c0x0000 (---------------) + I flanders 0x00242b07, // n0x0ef4 c0x0000 (---------------) + I florida 0x00245245, // n0x0ef5 c0x0000 (---------------) + I force 0x00246d4c, // n0x0ef6 c0x0000 (---------------) + I fortmissoula 0x00247749, // n0x0ef7 c0x0000 (---------------) + I fortworth 0x002d010a, // n0x0ef8 c0x0000 (---------------) + I foundation 0x00336cc9, // n0x0ef9 c0x0000 (---------------) + I francaise 0x00237e09, // n0x0efa c0x0000 (---------------) + I frankfurt 0x0032540c, // n0x0efb c0x0000 (---------------) + I franziskaner 0x002108cb, // n0x0efc c0x0000 (---------------) + I freemasonry 0x00249988, // n0x0efd c0x0000 (---------------) + I freiburg 0x0024a488, // n0x0efe c0x0000 (---------------) + I fribourg 0x0024a944, // n0x0eff c0x0000 (---------------) + I frog 0x00268488, // n0x0f00 c0x0000 (---------------) + I fundacio 0x00268d09, // n0x0f01 c0x0000 (---------------) + I furniture 0x00234c47, // n0x0f02 c0x0000 (---------------) + I gallery 0x00213306, // n0x0f03 c0x0000 (---------------) + I garden 0x002c20c7, // n0x0f04 c0x0000 (---------------) + I gateway 0x002330c9, // n0x0f05 c0x0000 (---------------) + I geelvinck 0x002f910b, // n0x0f06 c0x0000 (---------------) + I gemological 0x002d2f87, // n0x0f07 c0x0000 (---------------) + I geology 0x0030b147, // n0x0f08 c0x0000 (---------------) + I georgia 0x0030fac7, // n0x0f09 c0x0000 (---------------) + I giessen 0x002088c4, // n0x0f0a c0x0000 (---------------) + I glas 0x002088c5, // n0x0f0b c0x0000 (---------------) + I glass 0x0028a785, // n0x0f0c c0x0000 (---------------) + I gorge 0x002fd94b, // n0x0f0d c0x0000 (---------------) + I grandrapids 0x00339e84, // n0x0f0e c0x0000 (---------------) + I graz 0x00257a08, // n0x0f0f c0x0000 (---------------) + I guernsey 0x002490ca, // n0x0f10 c0x0000 (---------------) + I halloffame 0x002df847, // n0x0f11 c0x0000 (---------------) + I hamburg 0x00333c87, // n0x0f12 c0x0000 (---------------) + I handson 0x002730d2, // n0x0f13 c0x0000 (---------------) + I harvestcelebration 0x00276bc6, // n0x0f14 c0x0000 (---------------) + I hawaii 0x0021a586, // n0x0f15 c0x0000 (---------------) + I health 0x002b6d4e, // n0x0f16 c0x0000 (---------------) + I heimatunduhren 0x002ff986, // n0x0f17 c0x0000 (---------------) + I hellas 0x00298888, // n0x0f18 c0x0000 (---------------) + I helsinki 0x002e5ccf, // n0x0f19 c0x0000 (---------------) + I hembygdsforbund 0x0033f088, // n0x0f1a c0x0000 (---------------) + I heritage 0x0026e508, // n0x0f1b c0x0000 (---------------) + I histoire 0x002fdf8a, // n0x0f1c c0x0000 (---------------) + I historical 0x002fdf91, // n0x0f1d c0x0000 (---------------) + I historicalsociety 0x0028680e, // n0x0f1e c0x0000 (---------------) + I historichouses 0x0020418a, // n0x0f1f c0x0000 (---------------) + I historisch 0x0020418c, // n0x0f20 c0x0000 (---------------) + I historisches 0x00231087, // n0x0f21 c0x0000 (---------------) + I history 0x00231090, // n0x0f22 c0x0000 (---------------) + I historyofscience 0x00205108, // n0x0f23 c0x0000 (---------------) + I horology 0x002722c5, // n0x0f24 c0x0000 (---------------) + I house 0x0028caca, // n0x0f25 c0x0000 (---------------) + I humanities 0x0020980c, // n0x0f26 c0x0000 (---------------) + I illustration 0x002cf28d, // n0x0f27 c0x0000 (---------------) + I imageandsound 0x0020ca86, // n0x0f28 c0x0000 (---------------) + I indian 0x0020ca87, // n0x0f29 c0x0000 (---------------) + I indiana 0x0020ca8c, // n0x0f2a c0x0000 (---------------) + I indianapolis 0x0021260c, // n0x0f2b c0x0000 (---------------) + I indianmarket 0x0021fe4c, // n0x0f2c c0x0000 (---------------) + I intelligence 0x0029358b, // n0x0f2d c0x0000 (---------------) + I interactive 0x002696c4, // n0x0f2e c0x0000 (---------------) + I iraq 0x002134c4, // n0x0f2f c0x0000 (---------------) + I iron 0x00332649, // n0x0f30 c0x0000 (---------------) + I isleofman 0x003081c7, // n0x0f31 c0x0000 (---------------) + I jamison 0x0025d509, // n0x0f32 c0x0000 (---------------) + I jefferson 0x002dc189, // n0x0f33 c0x0000 (---------------) + I jerusalem 0x0031b107, // n0x0f34 c0x0000 (---------------) + I jewelry 0x0034a686, // n0x0f35 c0x0000 (---------------) + I jewish 0x0034a689, // n0x0f36 c0x0000 (---------------) + I jewishart 0x0028fcc3, // n0x0f37 c0x0000 (---------------) + I jfk 0x0021594a, // n0x0f38 c0x0000 (---------------) + I journalism 0x002fab87, // n0x0f39 c0x0000 (---------------) + I judaica 0x002037cb, // n0x0f3a c0x0000 (---------------) + I judygarland 0x0024104a, // n0x0f3b c0x0000 (---------------) + I juedisches 0x0031bb84, // n0x0f3c c0x0000 (---------------) + I juif 0x00316186, // n0x0f3d c0x0000 (---------------) + I karate 0x002cc409, // n0x0f3e c0x0000 (---------------) + I karikatur 0x0031c804, // n0x0f3f c0x0000 (---------------) + I kids 0x00213aca, // n0x0f40 c0x0000 (---------------) + I koebenhavn 0x0026ad05, // n0x0f41 c0x0000 (---------------) + I koeln 0x0029dd45, // n0x0f42 c0x0000 (---------------) + I kunst 0x0029dd4d, // n0x0f43 c0x0000 (---------------) + I kunstsammlung 0x0029e08e, // n0x0f44 c0x0000 (---------------) + I kunstunddesign 0x002f13c5, // n0x0f45 c0x0000 (---------------) + I labor 0x0033b8c6, // n0x0f46 c0x0000 (---------------) + I labour 0x00288947, // n0x0f47 c0x0000 (---------------) + I lajolla 0x00270fca, // n0x0f48 c0x0000 (---------------) + I lancashire 0x00209046, // n0x0f49 c0x0000 (---------------) + I landes 0x002e6e84, // n0x0f4a c0x0000 (---------------) + I lans 0x002e3747, // n0x0f4b c0x0000 (---------------) + I larsson 0x0025f54b, // n0x0f4c c0x0000 (---------------) + I lewismiller 0x00341587, // n0x0f4d c0x0000 (---------------) + I lincoln 0x002ea544, // n0x0f4e c0x0000 (---------------) + I linz 0x00336746, // n0x0f4f c0x0000 (---------------) + I living 0x0033674d, // n0x0f50 c0x0000 (---------------) + I livinghistory 0x002a93cc, // n0x0f51 c0x0000 (---------------) + I localhistory 0x002ad006, // n0x0f52 c0x0000 (---------------) + I london 0x00209c8a, // n0x0f53 c0x0000 (---------------) + I losangeles 0x0020e106, // n0x0f54 c0x0000 (---------------) + I louvre 0x00249f48, // n0x0f55 c0x0000 (---------------) + I loyalist 0x003048c7, // n0x0f56 c0x0000 (---------------) + I lucerne 0x0022d0ca, // n0x0f57 c0x0000 (---------------) + I luxembourg 0x00231846, // n0x0f58 c0x0000 (---------------) + I luzern 0x0022fe43, // n0x0f59 c0x0000 (---------------) + I mad 0x0025a246, // n0x0f5a c0x0000 (---------------) + I madrid 0x002c0008, // n0x0f5b c0x0000 (---------------) + I mallorca 0x0028074a, // n0x0f5c c0x0000 (---------------) + I manchester 0x00261307, // n0x0f5d c0x0000 (---------------) + I mansion 0x00261308, // n0x0f5e c0x0000 (---------------) + I mansions 0x00318944, // n0x0f5f c0x0000 (---------------) + I manx 0x00227647, // n0x0f60 c0x0000 (---------------) + I marburg 0x00253288, // n0x0f61 c0x0000 (---------------) + I maritime 0x00331208, // n0x0f62 c0x0000 (---------------) + I maritimo 0x0027ddc8, // n0x0f63 c0x0000 (---------------) + I maryland 0x00284a4a, // n0x0f64 c0x0000 (---------------) + I marylhurst 0x002e2905, // n0x0f65 c0x0000 (---------------) + I media 0x002382c7, // n0x0f66 c0x0000 (---------------) + I medical 0x00250e13, // n0x0f67 c0x0000 (---------------) + I medizinhistorisches 0x0027d446, // n0x0f68 c0x0000 (---------------) + I meeres 0x002ea388, // n0x0f69 c0x0000 (---------------) + I memorial 0x002dc809, // n0x0f6a c0x0000 (---------------) + I mesaverde 0x00229d08, // n0x0f6b c0x0000 (---------------) + I michigan 0x0027bfcb, // n0x0f6c c0x0000 (---------------) + I midatlantic 0x002ad5c8, // n0x0f6d c0x0000 (---------------) + I military 0x0025f684, // n0x0f6e c0x0000 (---------------) + I mill 0x002e4806, // n0x0f6f c0x0000 (---------------) + I miners 0x00289546, // n0x0f70 c0x0000 (---------------) + I mining 0x0029b1c9, // n0x0f71 c0x0000 (---------------) + I minnesota 0x0032a687, // n0x0f72 c0x0000 (---------------) + I missile 0x00246e48, // n0x0f73 c0x0000 (---------------) + I missoula 0x00286686, // n0x0f74 c0x0000 (---------------) + I modern 0x00214544, // n0x0f75 c0x0000 (---------------) + I moma 0x002ac245, // n0x0f76 c0x0000 (---------------) + I money 0x002ac4c8, // n0x0f77 c0x0000 (---------------) + I monmouth 0x002ace0a, // n0x0f78 c0x0000 (---------------) + I monticello 0x002ad7c8, // n0x0f79 c0x0000 (---------------) + I montreal 0x002b0906, // n0x0f7a c0x0000 (---------------) + I moscow 0x00280e4a, // n0x0f7b c0x0000 (---------------) + I motorcycle 0x00272788, // n0x0f7c c0x0000 (---------------) + I muenchen 0x002b2148, // n0x0f7d c0x0000 (---------------) + I muenster 0x002b3b08, // n0x0f7e c0x0000 (---------------) + I mulhouse 0x002b42c6, // n0x0f7f c0x0000 (---------------) + I muncie 0x002b8cc6, // n0x0f80 c0x0000 (---------------) + I museet 0x00341a8c, // n0x0f81 c0x0000 (---------------) + I museumcenter 0x002b9790, // n0x0f82 c0x0000 (---------------) + I museumvereniging 0x002aa905, // n0x0f83 c0x0000 (---------------) + I music 0x00208b08, // n0x0f84 c0x0000 (---------------) + I national 0x002cb610, // n0x0f85 c0x0000 (---------------) + I nationalfirearms 0x0033ee90, // n0x0f86 c0x0000 (---------------) + I nationalheritage 0x0033f5ce, // n0x0f87 c0x0000 (---------------) + I nativeamerican 0x0034170e, // n0x0f88 c0x0000 (---------------) + I naturalhistory 0x00341714, // n0x0f89 c0x0000 (---------------) + I naturalhistorymuseum 0x00201c8f, // n0x0f8a c0x0000 (---------------) + I naturalsciences 0x00202046, // n0x0f8b c0x0000 (---------------) + I nature 0x00204051, // n0x0f8c c0x0000 (---------------) + I naturhistorisches 0x00208293, // n0x0f8d c0x0000 (---------------) + I natuurwetenschappen 0x00208708, // n0x0f8e c0x0000 (---------------) + I naumburg 0x0020e005, // n0x0f8f c0x0000 (---------------) + I naval 0x002f4608, // n0x0f90 c0x0000 (---------------) + I nebraska 0x0024ae45, // n0x0f91 c0x0000 (---------------) + I neues 0x002f9a4c, // n0x0f92 c0x0000 (---------------) + I newhampshire 0x00223389, // n0x0f93 c0x0000 (---------------) + I newjersey 0x00278889, // n0x0f94 c0x0000 (---------------) + I newmexico 0x002c1e47, // n0x0f95 c0x0000 (---------------) + I newport 0x0030cc49, // n0x0f96 c0x0000 (---------------) + I newspaper 0x0023b807, // n0x0f97 c0x0000 (---------------) + I newyork 0x002ce946, // n0x0f98 c0x0000 (---------------) + I niepce 0x0022b707, // n0x0f99 c0x0000 (---------------) + I norfolk 0x00209505, // n0x0f9a c0x0000 (---------------) + I north 0x00231983, // n0x0f9b c0x0000 (---------------) + I nrw 0x002990c9, // n0x0f9c c0x0000 (---------------) + I nuernberg 0x002538c9, // n0x0f9d c0x0000 (---------------) + I nuremberg 0x00216043, // n0x0f9e c0x0000 (---------------) + I nyc 0x00319dc4, // n0x0f9f c0x0000 (---------------) + I nyny 0x00342d8d, // n0x0fa0 c0x0000 (---------------) + I oceanographic 0x003519cf, // n0x0fa1 c0x0000 (---------------) + I oceanographique 0x00295305, // n0x0fa2 c0x0000 (---------------) + I omaha 0x002f4506, // n0x0fa3 c0x0000 (---------------) + I online 0x0022c247, // n0x0fa4 c0x0000 (---------------) + I ontario 0x00259207, // n0x0fa5 c0x0000 (---------------) + I openair 0x0026c646, // n0x0fa6 c0x0000 (---------------) + I oregon 0x0026c64b, // n0x0fa7 c0x0000 (---------------) + I oregontrail 0x00287945, // n0x0fa8 c0x0000 (---------------) + I otago 0x00350106, // n0x0fa9 c0x0000 (---------------) + I oxford 0x00258c47, // n0x0faa c0x0000 (---------------) + I pacific 0x0022cd09, // n0x0fab c0x0000 (---------------) + I paderborn 0x0025fbc6, // n0x0fac c0x0000 (---------------) + I palace 0x00342c85, // n0x0fad c0x0000 (---------------) + I paleo 0x00222f0b, // n0x0fae c0x0000 (---------------) + I palmsprings 0x00226b06, // n0x0faf c0x0000 (---------------) + I panama 0x0024bc45, // n0x0fb0 c0x0000 (---------------) + I paris 0x0032c888, // n0x0fb1 c0x0000 (---------------) + I pasadena 0x002bb808, // n0x0fb2 c0x0000 (---------------) + I pharmacy 0x002bc10c, // n0x0fb3 c0x0000 (---------------) + I philadelphia 0x002bc110, // n0x0fb4 c0x0000 (---------------) + I philadelphiaarea 0x002bc7c9, // n0x0fb5 c0x0000 (---------------) + I philately 0x002bca07, // n0x0fb6 c0x0000 (---------------) + I phoenix 0x002bce4b, // n0x0fb7 c0x0000 (---------------) + I photography 0x002be506, // n0x0fb8 c0x0000 (---------------) + I pilots 0x002bef0a, // n0x0fb9 c0x0000 (---------------) + I pittsburgh 0x002c07cb, // n0x0fba c0x0000 (---------------) + I planetarium 0x002c0d0a, // n0x0fbb c0x0000 (---------------) + I plantation 0x002c0f86, // n0x0fbc c0x0000 (---------------) + I plants 0x002c1705, // n0x0fbd c0x0000 (---------------) + I plaza 0x002fa346, // n0x0fbe c0x0000 (---------------) + I portal 0x0029fc48, // n0x0fbf c0x0000 (---------------) + I portland 0x002c1f0a, // n0x0fc0 c0x0000 (---------------) + I portlligat 0x0021469c, // n0x0fc1 c0x0000 (---------------) + I posts-and-telecommunications 0x002c448c, // n0x0fc2 c0x0000 (---------------) + I preservation 0x002c4788, // n0x0fc3 c0x0000 (---------------) + I presidio 0x0020e2c5, // n0x0fc4 c0x0000 (---------------) + I press 0x002c6187, // n0x0fc5 c0x0000 (---------------) + I project 0x0029d706, // n0x0fc6 c0x0000 (---------------) + I public 0x0033df45, // n0x0fc7 c0x0000 (---------------) + I pubol 0x00351cc6, // n0x0fc8 c0x0000 (---------------) + I quebec 0x0026c808, // n0x0fc9 c0x0000 (---------------) + I railroad 0x0028f6c7, // n0x0fca c0x0000 (---------------) + I railway 0x002c31c8, // n0x0fcb c0x0000 (---------------) + I research 0x0033860a, // n0x0fcc c0x0000 (---------------) + I resistance 0x0022c34c, // n0x0fcd c0x0000 (---------------) + I riodejaneiro 0x002c14c9, // n0x0fce c0x0000 (---------------) + I rochester 0x00350407, // n0x0fcf c0x0000 (---------------) + I rockart 0x002952c4, // n0x0fd0 c0x0000 (---------------) + I roma 0x0023ac46, // n0x0fd1 c0x0000 (---------------) + I russia 0x0026e08a, // n0x0fd2 c0x0000 (---------------) + I saintlouis 0x002dc285, // n0x0fd3 c0x0000 (---------------) + I salem 0x0023680c, // n0x0fd4 c0x0000 (---------------) + I salvadordali 0x0023dec8, // n0x0fd5 c0x0000 (---------------) + I salzburg 0x002db848, // n0x0fd6 c0x0000 (---------------) + I sandiego 0x0024558c, // n0x0fd7 c0x0000 (---------------) + I sanfrancisco 0x0024eecc, // n0x0fd8 c0x0000 (---------------) + I santabarbara 0x00251289, // n0x0fd9 c0x0000 (---------------) + I santacruz 0x00252247, // n0x0fda c0x0000 (---------------) + I santafe 0x0027620c, // n0x0fdb c0x0000 (---------------) + I saskatchewan 0x0027f584, // n0x0fdc c0x0000 (---------------) + I satx 0x0028cd0a, // n0x0fdd c0x0000 (---------------) + I savannahga 0x0022198c, // n0x0fde c0x0000 (---------------) + I schlesisches 0x0025ae8b, // n0x0fdf c0x0000 (---------------) + I schoenbrunn 0x002d548b, // n0x0fe0 c0x0000 (---------------) + I schokoladen 0x002daa06, // n0x0fe1 c0x0000 (---------------) + I school 0x0031e807, // n0x0fe2 c0x0000 (---------------) + I schweiz 0x00201e47, // n0x0fe3 c0x0000 (---------------) + I science 0x002312cf, // n0x0fe4 c0x0000 (---------------) + I science-fiction 0x002e0c11, // n0x0fe5 c0x0000 (---------------) + I scienceandhistory 0x0033ea12, // n0x0fe6 c0x0000 (---------------) + I scienceandindustry 0x002e6f4d, // n0x0fe7 c0x0000 (---------------) + I sciencecenter 0x002e6f4e, // n0x0fe8 c0x0000 (---------------) + I sciencecenters 0x002e728e, // n0x0fe9 c0x0000 (---------------) + I sciencehistory 0x00201e48, // n0x0fea c0x0000 (---------------) + I sciences 0x00201e52, // n0x0feb c0x0000 (---------------) + I sciencesnaturelles 0x00208f48, // n0x0fec c0x0000 (---------------) + I scotland 0x002e5347, // n0x0fed c0x0000 (---------------) + I seaport 0x0031bf8a, // n0x0fee c0x0000 (---------------) + I settlement 0x0020f088, // n0x0fef c0x0000 (---------------) + I settlers 0x002ff945, // n0x0ff0 c0x0000 (---------------) + I shell 0x0030134a, // n0x0ff1 c0x0000 (---------------) + I sherbrooke 0x00205ac7, // n0x0ff2 c0x0000 (---------------) + I sibenik 0x002f5144, // n0x0ff3 c0x0000 (---------------) + I silk 0x0021dac3, // n0x0ff4 c0x0000 (---------------) + I ski 0x0021b585, // n0x0ff5 c0x0000 (---------------) + I skole 0x002fe207, // n0x0ff6 c0x0000 (---------------) + I society 0x002d8347, // n0x0ff7 c0x0000 (---------------) + I sologne 0x002cf48e, // n0x0ff8 c0x0000 (---------------) + I soundandvision 0x002d730d, // n0x0ff9 c0x0000 (---------------) + I southcarolina 0x002d7749, // n0x0ffa c0x0000 (---------------) + I southwest 0x002d7f45, // n0x0ffb c0x0000 (---------------) + I space 0x002d9c83, // n0x0ffc c0x0000 (---------------) + I spy 0x002d9ec6, // n0x0ffd c0x0000 (---------------) + I square 0x0024d0c5, // n0x0ffe c0x0000 (---------------) + I stadt 0x00224e88, // n0x0fff c0x0000 (---------------) + I stalbans 0x002d8f49, // n0x1000 c0x0000 (---------------) + I starnberg 0x0026f005, // n0x1001 c0x0000 (---------------) + I state 0x0026f00f, // n0x1002 c0x0000 (---------------) + I stateofdelaware 0x002a4147, // n0x1003 c0x0000 (---------------) + I station 0x002c6405, // n0x1004 c0x0000 (---------------) + I steam 0x0035340a, // n0x1005 c0x0000 (---------------) + I steiermark 0x002dca46, // n0x1006 c0x0000 (---------------) + I stjohn 0x002dcf89, // n0x1007 c0x0000 (---------------) + I stockholm 0x002ddccc, // n0x1008 c0x0000 (---------------) + I stpetersburg 0x002de449, // n0x1009 c0x0000 (---------------) + I stuttgart 0x00218a06, // n0x100a c0x0000 (---------------) + I suisse 0x00248ecc, // n0x100b c0x0000 (---------------) + I surgeonshall 0x002e0506, // n0x100c c0x0000 (---------------) + I surrey 0x002dff08, // n0x100d c0x0000 (---------------) + I svizzera 0x00289f46, // n0x100e c0x0000 (---------------) + I sweden 0x00263e46, // n0x100f c0x0000 (---------------) + I sydney 0x002e7c04, // n0x1010 c0x0000 (---------------) + I tank 0x00345f43, // n0x1011 c0x0000 (---------------) + I tcm 0x003449ca, // n0x1012 c0x0000 (---------------) + I technology 0x002c53d1, // n0x1013 c0x0000 (---------------) + I telekommunikation 0x002362ca, // n0x1014 c0x0000 (---------------) + I television 0x00237945, // n0x1015 c0x0000 (---------------) + I texas 0x00239907, // n0x1016 c0x0000 (---------------) + I textile 0x002fc247, // n0x1017 c0x0000 (---------------) + I theater 0x00253384, // n0x1018 c0x0000 (---------------) + I time 0x0025338b, // n0x1019 c0x0000 (---------------) + I timekeeping 0x002f34c8, // n0x101a c0x0000 (---------------) + I topology 0x0029b9c6, // n0x101b c0x0000 (---------------) + I torino 0x0023e205, // n0x101c c0x0000 (---------------) + I touch 0x0024c504, // n0x101d c0x0000 (---------------) + I town 0x0034a889, // n0x101e c0x0000 (---------------) + I transport 0x002b0804, // n0x101f c0x0000 (---------------) + I tree 0x00265d87, // n0x1020 c0x0000 (---------------) + I trolley 0x002de645, // n0x1021 c0x0000 (---------------) + I trust 0x002de647, // n0x1022 c0x0000 (---------------) + I trustee 0x002b6f85, // n0x1023 c0x0000 (---------------) + I uhren 0x0020a9c3, // n0x1024 c0x0000 (---------------) + I ulm 0x002e5208, // n0x1025 c0x0000 (---------------) + I undersea 0x00207f4a, // n0x1026 c0x0000 (---------------) + I university 0x0022dec3, // n0x1027 c0x0000 (---------------) + I usa 0x0022f34a, // n0x1028 c0x0000 (---------------) + I usantiques 0x002fb346, // n0x1029 c0x0000 (---------------) + I usarts 0x0026ed8f, // n0x102a c0x0000 (---------------) + I uscountryestate 0x0034cb49, // n0x102b c0x0000 (---------------) + I usculture 0x00254210, // n0x102c c0x0000 (---------------) + I usdecorativearts 0x00292ec8, // n0x102d c0x0000 (---------------) + I usgarden 0x002b0b89, // n0x102e c0x0000 (---------------) + I ushistory 0x002b3947, // n0x102f c0x0000 (---------------) + I ushuaia 0x003366cf, // n0x1030 c0x0000 (---------------) + I uslivinghistory 0x00235e84, // n0x1031 c0x0000 (---------------) + I utah 0x0022fac4, // n0x1032 c0x0000 (---------------) + I uvic 0x00218846, // n0x1033 c0x0000 (---------------) + I valley 0x0029af86, // n0x1034 c0x0000 (---------------) + I vantaa 0x0027510a, // n0x1035 c0x0000 (---------------) + I versailles 0x002da1c6, // n0x1036 c0x0000 (---------------) + I viking 0x0030ea87, // n0x1037 c0x0000 (---------------) + I village 0x002e2f48, // n0x1038 c0x0000 (---------------) + I virginia 0x002e3147, // n0x1039 c0x0000 (---------------) + I virtual 0x002e3307, // n0x103a c0x0000 (---------------) + I virtuel 0x002f0a0a, // n0x103b c0x0000 (---------------) + I vlaanderen 0x002e504b, // n0x103c c0x0000 (---------------) + I volkenkunde 0x00263505, // n0x103d c0x0000 (---------------) + I wales 0x0033e648, // n0x103e c0x0000 (---------------) + I wallonie 0x0020a683, // n0x103f c0x0000 (---------------) + I war 0x0020014c, // n0x1040 c0x0000 (---------------) + I washingtondc 0x0021ba8f, // n0x1041 c0x0000 (---------------) + I watch-and-clock 0x0020094d, // n0x1042 c0x0000 (---------------) + I watchandclock 0x002d7887, // n0x1043 c0x0000 (---------------) + I western 0x00225709, // n0x1044 c0x0000 (---------------) + I westfalen 0x002a1ec7, // n0x1045 c0x0000 (---------------) + I whaling 0x002c9cc8, // n0x1046 c0x0000 (---------------) + I wildlife 0x0023a0cc, // n0x1047 c0x0000 (---------------) + I williamsburg 0x0031cf88, // n0x1048 c0x0000 (---------------) + I windmill 0x00227dc8, // n0x1049 c0x0000 (---------------) + I workshop 0x002e760e, // n0x104a c0x0000 (---------------) + I xn--9dbhblg6di 0x002f6694, // n0x104b c0x0000 (---------------) + I xn--comunicaes-v6a2o 0x002f6ba4, // n0x104c c0x0000 (---------------) + I xn--correios-e-telecomunicaes-ghc29a 0x00308bca, // n0x104d c0x0000 (---------------) + I xn--h1aegh 0x0031e24b, // n0x104e c0x0000 (---------------) + I xn--lns-qla 0x0023b8c4, // n0x104f c0x0000 (---------------) + I york 0x0023b8c9, // n0x1050 c0x0000 (---------------) + I yorkshire 0x003116c8, // n0x1051 c0x0000 (---------------) + I yosemite 0x0028eac5, // n0x1052 c0x0000 (---------------) + I youth 0x0026f40a, // n0x1053 c0x0000 (---------------) + I zoological 0x0022f007, // n0x1054 c0x0000 (---------------) + I zoology 0x002251c4, // n0x1055 c0x0000 (---------------) + I aero 0x002b5183, // n0x1056 c0x0000 (---------------) + I biz 0x002104c3, // n0x1057 c0x0000 (---------------) + I com 0x00236044, // n0x1058 c0x0000 (---------------) + I coop 0x002ceec3, // n0x1059 c0x0000 (---------------) + I edu 0x002150c3, // n0x105a c0x0000 (---------------) + I gov 0x002180c4, // n0x105b c0x0000 (---------------) + I info 0x0021fe43, // n0x105c c0x0000 (---------------) + I int 0x0025f683, // n0x105d c0x0000 (---------------) + I mil 0x002b9786, // n0x105e c0x0000 (---------------) + I museum 0x002d16c4, // n0x105f c0x0000 (---------------) + I name 0x00239bc3, // n0x1060 c0x0000 (---------------) + I net 0x002453c3, // n0x1061 c0x0000 (---------------) + I org 0x002c5983, // n0x1062 c0x0000 (---------------) + I pro 0x002028c2, // n0x1063 c0x0000 (---------------) + I ac 0x002b5183, // n0x1064 c0x0000 (---------------) + I biz 0x00208f82, // n0x1065 c0x0000 (---------------) + I co 0x002104c3, // n0x1066 c0x0000 (---------------) + I com 0x00236044, // n0x1067 c0x0000 (---------------) + I coop 0x002ceec3, // n0x1068 c0x0000 (---------------) + I edu 0x002150c3, // n0x1069 c0x0000 (---------------) + I gov 0x0021fe43, // n0x106a c0x0000 (---------------) + I int 0x002b9786, // n0x106b c0x0000 (---------------) + I museum 0x00239bc3, // n0x106c c0x0000 (---------------) + I net 0x002453c3, // n0x106d c0x0000 (---------------) + I org 0x00031c88, // n0x106e c0x0000 (---------------) + blogspot 0x002104c3, // n0x106f c0x0000 (---------------) + I com 0x002ceec3, // n0x1070 c0x0000 (---------------) + I edu 0x00230083, // n0x1071 c0x0000 (---------------) + I gob 0x00239bc3, // n0x1072 c0x0000 (---------------) + I net 0x002453c3, // n0x1073 c0x0000 (---------------) + I org 0x002104c3, // n0x1074 c0x0000 (---------------) + I com 0x002ceec3, // n0x1075 c0x0000 (---------------) + I edu 0x002150c3, // n0x1076 c0x0000 (---------------) + I gov 0x0025f683, // n0x1077 c0x0000 (---------------) + I mil 0x002d16c4, // n0x1078 c0x0000 (---------------) + I name 0x00239bc3, // n0x1079 c0x0000 (---------------) + I net 0x002453c3, // n0x107a c0x0000 (---------------) + I org 0x0068bb08, // n0x107b c0x0001 (---------------) ! I teledata 0x00200402, // n0x107c c0x0000 (---------------) + I ca 0x00201942, // n0x107d c0x0000 (---------------) + I cc 0x00208f82, // n0x107e c0x0000 (---------------) + I co 0x002104c3, // n0x107f c0x0000 (---------------) + I com 0x00203a42, // n0x1080 c0x0000 (---------------) + I dr 0x00200242, // n0x1081 c0x0000 (---------------) + I in 0x002180c4, // n0x1082 c0x0000 (---------------) + I info 0x0020adc4, // n0x1083 c0x0000 (---------------) + I mobi 0x0032a542, // n0x1084 c0x0000 (---------------) + I mx 0x002d16c4, // n0x1085 c0x0000 (---------------) + I name 0x00204282, // n0x1086 c0x0000 (---------------) + I or 0x002453c3, // n0x1087 c0x0000 (---------------) + I org 0x002c5983, // n0x1088 c0x0000 (---------------) + I pro 0x002daa06, // n0x1089 c0x0000 (---------------) + I school 0x0027ecc2, // n0x108a c0x0000 (---------------) + I tv 0x00202342, // n0x108b c0x0000 (---------------) + I us 0x0021c282, // n0x108c c0x0000 (---------------) + I ws 0x31e1a783, // n0x108d c0x00c7 (n0x108f-n0x1090) o I her 0x32204183, // n0x108e c0x00c8 (n0x1090-n0x1091) o I his 0x00045386, // n0x108f c0x0000 (---------------) + forgot 0x00045386, // n0x1090 c0x0000 (---------------) + forgot 0x00202f44, // n0x1091 c0x0000 (---------------) + I asso 0x00002bcc, // n0x1092 c0x0000 (---------------) + at-band-camp 0x0000be47, // n0x1093 c0x0000 (---------------) + blogdns 0x0001e988, // n0x1094 c0x0000 (---------------) + broke-it 0x000721ca, // n0x1095 c0x0000 (---------------) + buyshouses 0x0002c08a, // n0x1096 c0x0000 (---------------) + cloudfront 0x00032888, // n0x1097 c0x0000 (---------------) + dnsalias 0x0005a447, // n0x1098 c0x0000 (---------------) + dnsdojo 0x00030187, // n0x1099 c0x0000 (---------------) + does-it 0x0010c549, // n0x109a c0x0000 (---------------) + dontexist 0x00078ac8, // n0x109b c0x0000 (---------------) + dynalias 0x0003bbc9, // n0x109c c0x0000 (---------------) + dynathome 0x0008b5cd, // n0x109d c0x0000 (---------------) + endofinternet 0x32f05246, // n0x109e c0x00cb (n0x10bd-n0x10bf) o I fastly 0x0004b507, // n0x109f c0x0000 (---------------) + from-az 0x0004bf47, // n0x10a0 c0x0000 (---------------) + from-co 0x0004fd07, // n0x10a1 c0x0000 (---------------) + from-la 0x00057c07, // n0x10a2 c0x0000 (---------------) + from-ny 0x00072c02, // n0x10a3 c0x0000 (---------------) + gb 0x00034e47, // n0x10a4 c0x0000 (---------------) + gets-it 0x00058f8c, // n0x10a5 c0x0000 (---------------) + ham-radio-op 0x00011207, // n0x10a6 c0x0000 (---------------) + homeftp 0x0012c746, // n0x10a7 c0x0000 (---------------) + homeip 0x00089109, // n0x10a8 c0x0000 (---------------) + homelinux 0x000896c8, // n0x10a9 c0x0000 (---------------) + homeunix 0x0003d6c2, // n0x10aa c0x0000 (---------------) + hu 0x0010c80b, // n0x10ab c0x0000 (---------------) + in-the-band 0x00105049, // n0x10ac c0x0000 (---------------) + is-a-chef 0x0005a6c9, // n0x10ad c0x0000 (---------------) + is-a-geek 0x00043088, // n0x10ae c0x0000 (---------------) + isa-geek 0x00090082, // n0x10af c0x0000 (---------------) + jp 0x000a0209, // n0x10b0 c0x0000 (---------------) + kicks-ass 0x00016f8d, // n0x10b1 c0x0000 (---------------) + office-on-the 0x000c2e47, // n0x10b2 c0x0000 (---------------) + podzone 0x000b114d, // n0x10b3 c0x0000 (---------------) + scrapper-site 0x00000482, // n0x10b4 c0x0000 (---------------) + se 0x00108ec6, // n0x10b5 c0x0000 (---------------) + selfip 0x000b3c88, // n0x10b6 c0x0000 (---------------) + sells-it 0x000c10c8, // n0x10b7 c0x0000 (---------------) + servebbs 0x000c1288, // n0x10b8 c0x0000 (---------------) + serveftp 0x0001a688, // n0x10b9 c0x0000 (---------------) + thruhere 0x00003ec2, // n0x10ba c0x0000 (---------------) + uk 0x00017306, // n0x10bb c0x0000 (---------------) + webhop 0x00002702, // n0x10bc c0x0000 (---------------) + za 0x332c5c04, // n0x10bd c0x00cc (n0x10bf-n0x10c1) o I prod 0x33648903, // n0x10be c0x00cd (n0x10c1-n0x10c4) o I ssl 0x00000101, // n0x10bf c0x0000 (---------------) + a 0x000a2046, // n0x10c0 c0x0000 (---------------) + global 0x00000101, // n0x10c1 c0x0000 (---------------) + a 0x00000001, // n0x10c2 c0x0000 (---------------) + b 0x000a2046, // n0x10c3 c0x0000 (---------------) + global 0x0023fec4, // n0x10c4 c0x0000 (---------------) + I arts 0x002104c3, // n0x10c5 c0x0000 (---------------) + I com 0x00240684, // n0x10c6 c0x0000 (---------------) + I firm 0x002180c4, // n0x10c7 c0x0000 (---------------) + I info 0x00239bc3, // n0x10c8 c0x0000 (---------------) + I net 0x00248705, // n0x10c9 c0x0000 (---------------) + I other 0x0020f983, // n0x10ca c0x0000 (---------------) + I per 0x002a8343, // n0x10cb c0x0000 (---------------) + I rec 0x002dd805, // n0x10cc c0x0000 (---------------) + I store 0x00209243, // n0x10cd c0x0000 (---------------) + I web 0x002104c3, // n0x10ce c0x0000 (---------------) + I com 0x002ceec3, // n0x10cf c0x0000 (---------------) + I edu 0x002150c3, // n0x10d0 c0x0000 (---------------) + I gov 0x0025f683, // n0x10d1 c0x0000 (---------------) + I mil 0x0020adc4, // n0x10d2 c0x0000 (---------------) + I mobi 0x002d16c4, // n0x10d3 c0x0000 (---------------) + I name 0x00239bc3, // n0x10d4 c0x0000 (---------------) + I net 0x002453c3, // n0x10d5 c0x0000 (---------------) + I org 0x00204343, // n0x10d6 c0x0000 (---------------) + I sch 0x00031c88, // n0x10d7 c0x0000 (---------------) + blogspot 0x00223ac2, // n0x10d8 c0x0000 (---------------) + I bv 0x00008f82, // n0x10d9 c0x0000 (---------------) + co 0x34a01602, // n0x10da c0x00d2 (n0x13b0-n0x13b1) + I aa 0x002fad08, // n0x10db c0x0000 (---------------) + I aarborte 0x00221746, // n0x10dc c0x0000 (---------------) + I aejrie 0x00207406, // n0x10dd c0x0000 (---------------) + I afjord 0x002210c7, // n0x10de c0x0000 (---------------) + I agdenes 0x34e03682, // n0x10df c0x00d3 (n0x13b1-n0x13b2) + I ah 0x3526ec08, // n0x10e0 c0x00d4 (n0x13b2-n0x13b3) o I akershus 0x0027988a, // n0x10e1 c0x0000 (---------------) + I aknoluokta 0x00203b48, // n0x10e2 c0x0000 (---------------) + I akrehamn 0x00201dc2, // n0x10e3 c0x0000 (---------------) + I al 0x00203609, // n0x10e4 c0x0000 (---------------) + I alaheadju 0x00263547, // n0x10e5 c0x0000 (---------------) + I alesund 0x00213286, // n0x10e6 c0x0000 (---------------) + I algard 0x0030fd89, // n0x10e7 c0x0000 (---------------) + I alstahaug 0x00238404, // n0x10e8 c0x0000 (---------------) + I alta 0x00203206, // n0x10e9 c0x0000 (---------------) + I alvdal 0x002f98c4, // n0x10ea c0x0000 (---------------) + I amli 0x0020a744, // n0x10eb c0x0000 (---------------) + I amot 0x00246989, // n0x10ec c0x0000 (---------------) + I andasuolo 0x00349846, // n0x10ed c0x0000 (---------------) + I andebu 0x002236c5, // n0x10ee c0x0000 (---------------) + I andoy 0x0024a805, // n0x10ef c0x0000 (---------------) + I ardal 0x0024e047, // n0x10f0 c0x0000 (---------------) + I aremark 0x002d9f87, // n0x10f1 c0x0000 (---------------) + I arendal 0x0024a744, // n0x10f2 c0x0000 (---------------) + I arna 0x00221306, // n0x10f3 c0x0000 (---------------) + I aseral 0x0025ac05, // n0x10f4 c0x0000 (---------------) + I asker 0x002d8b45, // n0x10f5 c0x0000 (---------------) + I askim 0x002ffa85, // n0x10f6 c0x0000 (---------------) + I askoy 0x0033a347, // n0x10f7 c0x0000 (---------------) + I askvoll 0x002f89c5, // n0x10f8 c0x0000 (---------------) + I asnes 0x002f7849, // n0x10f9 c0x0000 (---------------) + I audnedaln 0x0022e345, // n0x10fa c0x0000 (---------------) + I aukra 0x002c78c4, // n0x10fb c0x0000 (---------------) + I aure 0x00349747, // n0x10fc c0x0000 (---------------) + I aurland 0x002a7f8e, // n0x10fd c0x0000 (---------------) + I aurskog-holand 0x002ec009, // n0x10fe c0x0000 (---------------) + I austevoll 0x002b6c09, // n0x10ff c0x0000 (---------------) + I austrheim 0x0023ea46, // n0x1100 c0x0000 (---------------) + I averoy 0x00308048, // n0x1101 c0x0000 (---------------) + I badaddja 0x002bf7cb, // n0x1102 c0x0000 (---------------) + I bahcavuotna 0x0028dacc, // n0x1103 c0x0000 (---------------) + I bahccavuotna 0x00288bc6, // n0x1104 c0x0000 (---------------) + I baidar 0x0032b207, // n0x1105 c0x0000 (---------------) + I bajddar 0x002a2105, // n0x1106 c0x0000 (---------------) + I balat 0x002ed40a, // n0x1107 c0x0000 (---------------) + I balestrand 0x0028be09, // n0x1108 c0x0000 (---------------) + I ballangen 0x002a6349, // n0x1109 c0x0000 (---------------) + I balsfjord 0x0034ed06, // n0x110a c0x0000 (---------------) + I bamble 0x002df6c5, // n0x110b c0x0000 (---------------) + I bardu 0x00310985, // n0x110c c0x0000 (---------------) + I barum 0x00338d09, // n0x110d c0x0000 (---------------) + I batsfjord 0x002b560b, // n0x110e c0x0000 (---------------) + I bearalvahki 0x00263146, // n0x110f c0x0000 (---------------) + I beardu 0x0021b006, // n0x1110 c0x0000 (---------------) + I beiarn 0x00241b04, // n0x1111 c0x0000 (---------------) + I berg 0x00241b06, // n0x1112 c0x0000 (---------------) + I bergen 0x002bba08, // n0x1113 c0x0000 (---------------) + I berlevag 0x00202ac6, // n0x1114 c0x0000 (---------------) + I bievat 0x00259d86, // n0x1115 c0x0000 (---------------) + I bindal 0x0020d008, // n0x1116 c0x0000 (---------------) + I birkenes 0x0020eb47, // n0x1117 c0x0000 (---------------) + I bjarkoy 0x0020f749, // n0x1118 c0x0000 (---------------) + I bjerkreim 0x0020fac5, // n0x1119 c0x0000 (---------------) + I bjugn 0x00031c88, // n0x111a c0x0000 (---------------) + blogspot 0x00230104, // n0x111b c0x0000 (---------------) + I bodo 0x00275444, // n0x111c c0x0000 (---------------) + I bokn 0x00211a05, // n0x111d c0x0000 (---------------) + I bomlo 0x00219889, // n0x111e c0x0000 (---------------) + I bremanger 0x0021f547, // n0x111f c0x0000 (---------------) + I bronnoy 0x0021f54b, // n0x1120 c0x0000 (---------------) + I bronnoysund 0x0022014a, // n0x1121 c0x0000 (---------------) + I brumunddal 0x002232c5, // n0x1122 c0x0000 (---------------) + I bryne 0x35606742, // n0x1123 c0x00d5 (n0x13b3-n0x13b4) + I bu 0x00240f07, // n0x1124 c0x0000 (---------------) + I budejju 0x35a78648, // n0x1125 c0x00d6 (n0x13b4-n0x13b5) o I buskerud 0x00214087, // n0x1126 c0x0000 (---------------) + I bygland 0x002cb005, // n0x1127 c0x0000 (---------------) + I bykle 0x002a91ca, // n0x1128 c0x0000 (---------------) + I cahcesuolo 0x00008f82, // n0x1129 c0x0000 (---------------) + co 0x0022e7cb, // n0x112a c0x0000 (---------------) + I davvenjarga 0x0026a04a, // n0x112b c0x0000 (---------------) + I davvesiida 0x00350246, // n0x112c c0x0000 (---------------) + I deatnu 0x0023e483, // n0x112d c0x0000 (---------------) + I dep 0x002a9b8d, // n0x112e c0x0000 (---------------) + I dielddanuorri 0x002eb58c, // n0x112f c0x0000 (---------------) + I divtasvuodna 0x002b664d, // n0x1130 c0x0000 (---------------) + I divttasvuotna 0x0021a1c5, // n0x1131 c0x0000 (---------------) + I donna 0x0032fd05, // n0x1132 c0x0000 (---------------) + I dovre 0x00298f47, // n0x1133 c0x0000 (---------------) + I drammen 0x00351649, // n0x1134 c0x0000 (---------------) + I drangedal 0x00203a46, // n0x1135 c0x0000 (---------------) + I drobak 0x00229845, // n0x1136 c0x0000 (---------------) + I dyroy 0x0029a108, // n0x1137 c0x0000 (---------------) + I egersund 0x00272a43, // n0x1138 c0x0000 (---------------) + I eid 0x00324788, // n0x1139 c0x0000 (---------------) + I eidfjord 0x00272a48, // n0x113a c0x0000 (---------------) + I eidsberg 0x002a58c7, // n0x113b c0x0000 (---------------) + I eidskog 0x002f4908, // n0x113c c0x0000 (---------------) + I eidsvoll 0x002a9989, // n0x113d c0x0000 (---------------) + I eigersund 0x002fcf47, // n0x113e c0x0000 (---------------) + I elverum 0x00205f07, // n0x113f c0x0000 (---------------) + I enebakk 0x0030fc08, // n0x1140 c0x0000 (---------------) + I engerdal 0x002e9104, // n0x1141 c0x0000 (---------------) + I etne 0x002e9107, // n0x1142 c0x0000 (---------------) + I etnedal 0x002058c8, // n0x1143 c0x0000 (---------------) + I evenassi 0x00213e86, // n0x1144 c0x0000 (---------------) + I evenes 0x00350f0f, // n0x1145 c0x0000 (---------------) + I evje-og-hornnes 0x002bf247, // n0x1146 c0x0000 (---------------) + I farsund 0x0031bc46, // n0x1147 c0x0000 (---------------) + I fauske 0x00252385, // n0x1148 c0x0000 (---------------) + I fedje 0x00319f43, // n0x1149 c0x0000 (---------------) + I fet 0x00329f47, // n0x114a c0x0000 (---------------) + I fetsund 0x00333143, // n0x114b c0x0000 (---------------) + I fhs 0x00240346, // n0x114c c0x0000 (---------------) + I finnoy 0x00240a46, // n0x114d c0x0000 (---------------) + I fitjar 0x00241506, // n0x114e c0x0000 (---------------) + I fjaler 0x002769c5, // n0x114f c0x0000 (---------------) + I fjell 0x0024cfc3, // n0x1150 c0x0000 (---------------) + I fla 0x0024cfc8, // n0x1151 c0x0000 (---------------) + I flakstad 0x0032e909, // n0x1152 c0x0000 (---------------) + I flatanger 0x0024174b, // n0x1153 c0x0000 (---------------) + I flekkefjord 0x00241a08, // n0x1154 c0x0000 (---------------) + I flesberg 0x002427c5, // n0x1155 c0x0000 (---------------) + I flora 0x00242cc5, // n0x1156 c0x0000 (---------------) + I floro 0x35f32782, // n0x1157 c0x00d7 (n0x13b5-n0x13b6) + I fm 0x0022b7c9, // n0x1158 c0x0000 (---------------) + I folkebibl 0x002438c7, // n0x1159 c0x0000 (---------------) + I folldal 0x00350185, // n0x115a c0x0000 (---------------) + I forde 0x00246887, // n0x115b c0x0000 (---------------) + I forsand 0x00248106, // n0x115c c0x0000 (---------------) + I fosnes 0x00322085, // n0x115d c0x0000 (---------------) + I frana 0x0024944b, // n0x115e c0x0000 (---------------) + I fredrikstad 0x00249984, // n0x115f c0x0000 (---------------) + I frei 0x0024a945, // n0x1160 c0x0000 (---------------) + I frogn 0x0024aa87, // n0x1161 c0x0000 (---------------) + I froland 0x0025ec46, // n0x1162 c0x0000 (---------------) + I frosta 0x0025ef05, // n0x1163 c0x0000 (---------------) + I froya 0x00268687, // n0x1164 c0x0000 (---------------) + I fuoisku 0x00268a47, // n0x1165 c0x0000 (---------------) + I fuossko 0x002d1484, // n0x1166 c0x0000 (---------------) + I fusa 0x0026d04a, // n0x1167 c0x0000 (---------------) + I fylkesbibl 0x0026d2c8, // n0x1168 c0x0000 (---------------) + I fyresdal 0x00344689, // n0x1169 c0x0000 (---------------) + I gaivuotna 0x0022ea05, // n0x116a c0x0000 (---------------) + I galsa 0x0021ad46, // n0x116b c0x0000 (---------------) + I gamvik 0x002bbbca, // n0x116c c0x0000 (---------------) + I gangaviika 0x002bbec6, // n0x116d c0x0000 (---------------) + I gaular 0x0024dac7, // n0x116e c0x0000 (---------------) + I gausdal 0x00343e4d, // n0x116f c0x0000 (---------------) + I giehtavuoatna 0x002a8a49, // n0x1170 c0x0000 (---------------) + I gildeskal 0x00327685, // n0x1171 c0x0000 (---------------) + I giske 0x002d9147, // n0x1172 c0x0000 (---------------) + I gjemnes 0x002ea1c8, // n0x1173 c0x0000 (---------------) + I gjerdrum 0x00318488, // n0x1174 c0x0000 (---------------) + I gjerstad 0x00349b07, // n0x1175 c0x0000 (---------------) + I gjesdal 0x00350a46, // n0x1176 c0x0000 (---------------) + I gjovik 0x002277c7, // n0x1177 c0x0000 (---------------) + I gloppen 0x002a6603, // n0x1178 c0x0000 (---------------) + I gol 0x002fd944, // n0x1179 c0x0000 (---------------) + I gran 0x00302d85, // n0x117a c0x0000 (---------------) + I grane 0x00320387, // n0x117b c0x0000 (---------------) + I granvin 0x00335689, // n0x117c c0x0000 (---------------) + I gratangen 0x0023d808, // n0x117d c0x0000 (---------------) + I grimstad 0x00333585, // n0x117e c0x0000 (---------------) + I grong 0x00243584, // n0x117f c0x0000 (---------------) + I grue 0x00249b45, // n0x1180 c0x0000 (---------------) + I gulen 0x0025360d, // n0x1181 c0x0000 (---------------) + I guovdageaidnu 0x00200a42, // n0x1182 c0x0000 (---------------) + I ha 0x002953c6, // n0x1183 c0x0000 (---------------) + I habmer 0x00308e06, // n0x1184 c0x0000 (---------------) + I hadsel 0x0032290a, // n0x1185 c0x0000 (---------------) + I hagebostad 0x0026de46, // n0x1186 c0x0000 (---------------) + I halden 0x0026dfc5, // n0x1187 c0x0000 (---------------) + I halsa 0x00344205, // n0x1188 c0x0000 (---------------) + I hamar 0x00344207, // n0x1189 c0x0000 (---------------) + I hamaroy 0x0026e70c, // n0x118a c0x0000 (---------------) + I hammarfeasta 0x00236bca, // n0x118b c0x0000 (---------------) + I hammerfest 0x00271446, // n0x118c c0x0000 (---------------) + I hapmir 0x002aac85, // n0x118d c0x0000 (---------------) + I haram 0x00272986, // n0x118e c0x0000 (---------------) + I hareid 0x00272f07, // n0x118f c0x0000 (---------------) + I harstad 0x00274cc6, // n0x1190 c0x0000 (---------------) + I hasvik 0x002768cc, // n0x1191 c0x0000 (---------------) + I hattfjelldal 0x0030fec9, // n0x1192 c0x0000 (---------------) + I haugesund 0x36244c47, // n0x1193 c0x00d8 (n0x13b6-n0x13b9) o I hedmark 0x0024ed85, // n0x1194 c0x0000 (---------------) + I hemne 0x0024ed86, // n0x1195 c0x0000 (---------------) + I hemnes 0x00277fc8, // n0x1196 c0x0000 (---------------) + I hemsedal 0x00286c05, // n0x1197 c0x0000 (---------------) + I herad 0x00288005, // n0x1198 c0x0000 (---------------) + I hitra 0x00288248, // n0x1199 c0x0000 (---------------) + I hjartdal 0x0028844a, // n0x119a c0x0000 (---------------) + I hjelmeland 0x36621a02, // n0x119b c0x00d9 (n0x13b9-n0x13ba) + I hl 0x36a71702, // n0x119c c0x00da (n0x13ba-n0x13bb) + I hm 0x002d2185, // n0x119d c0x0000 (---------------) + I hobol 0x002bf143, // n0x119e c0x0000 (---------------) + I hof 0x0032bc08, // n0x119f c0x0000 (---------------) + I hokksund 0x002886c3, // n0x11a0 c0x0000 (---------------) + I hol 0x00288d44, // n0x11a1 c0x0000 (---------------) + I hole 0x002dd0cb, // n0x11a2 c0x0000 (---------------) + I holmestrand 0x00345a08, // n0x11a3 c0x0000 (---------------) + I holtalen 0x002e2a88, // n0x11a4 c0x0000 (---------------) + I honefoss 0x36ea6f89, // n0x11a5 c0x00db (n0x13bb-n0x13bc) o I hordaland 0x0028b289, // n0x11a6 c0x0000 (---------------) + I hornindal 0x0028b4c6, // n0x11a7 c0x0000 (---------------) + I horten 0x0028c048, // n0x11a8 c0x0000 (---------------) + I hoyanger 0x0028c249, // n0x11a9 c0x0000 (---------------) + I hoylandet 0x0028cf86, // n0x11aa c0x0000 (---------------) + I hurdal 0x0028d105, // n0x11ab c0x0000 (---------------) + I hurum 0x0023da46, // n0x11ac c0x0000 (---------------) + I hvaler 0x0031a089, // n0x11ad c0x0000 (---------------) + I hyllestad 0x002b64c7, // n0x11ae c0x0000 (---------------) + I ibestad 0x0029ebc6, // n0x11af c0x0000 (---------------) + I idrett 0x002e0887, // n0x11b0 c0x0000 (---------------) + I inderoy 0x002eb407, // n0x11b1 c0x0000 (---------------) + I iveland 0x00257984, // n0x11b2 c0x0000 (---------------) + I ivgu 0x37219389, // n0x11b3 c0x00dc (n0x13bc-n0x13bd) + I jan-mayen 0x00256348, // n0x11b4 c0x0000 (---------------) + I jessheim 0x00315448, // n0x11b5 c0x0000 (---------------) + I jevnaker 0x002c8d47, // n0x11b6 c0x0000 (---------------) + I jolster 0x002abcc6, // n0x11b7 c0x0000 (---------------) + I jondal 0x00247a89, // n0x11b8 c0x0000 (---------------) + I jorpeland 0x002073c7, // n0x11b9 c0x0000 (---------------) + I kafjord 0x002e450a, // n0x11ba c0x0000 (---------------) + I karasjohka 0x002e6ac8, // n0x11bb c0x0000 (---------------) + I karasjok 0x002a6907, // n0x11bc c0x0000 (---------------) + I karlsoy 0x0031a5c6, // n0x11bd c0x0000 (---------------) + I karmoy 0x0031fb4a, // n0x11be c0x0000 (---------------) + I kautokeino 0x00252088, // n0x11bf c0x0000 (---------------) + I kirkenes 0x0028fd45, // n0x11c0 c0x0000 (---------------) + I klabu 0x00222e05, // n0x11c1 c0x0000 (---------------) + I klepp 0x002c0607, // n0x11c2 c0x0000 (---------------) + I kommune 0x002dfcc9, // n0x11c3 c0x0000 (---------------) + I kongsberg 0x002f520b, // n0x11c4 c0x0000 (---------------) + I kongsvinger 0x0031e5c8, // n0x11c5 c0x0000 (---------------) + I kopervik 0x0022e3c9, // n0x11c6 c0x0000 (---------------) + I kraanghke 0x00299307, // n0x11c7 c0x0000 (---------------) + I kragero 0x0029a30c, // n0x11c8 c0x0000 (---------------) + I kristiansand 0x0029a78c, // n0x11c9 c0x0000 (---------------) + I kristiansund 0x0029aa8a, // n0x11ca c0x0000 (---------------) + I krodsherad 0x0029ad0c, // n0x11cb c0x0000 (---------------) + I krokstadelva 0x002a4788, // n0x11cc c0x0000 (---------------) + I kvafjord 0x002a4988, // n0x11cd c0x0000 (---------------) + I kvalsund 0x002a4b84, // n0x11ce c0x0000 (---------------) + I kvam 0x002a5049, // n0x11cf c0x0000 (---------------) + I kvanangen 0x002a5289, // n0x11d0 c0x0000 (---------------) + I kvinesdal 0x002a54ca, // n0x11d1 c0x0000 (---------------) + I kvinnherad 0x002a5749, // n0x11d2 c0x0000 (---------------) + I kviteseid 0x002a5a87, // n0x11d3 c0x0000 (---------------) + I kvitsoy 0x002015cc, // n0x11d4 c0x0000 (---------------) + I laakesvuemie 0x0024fe46, // n0x11d5 c0x0000 (---------------) + I lahppi 0x0023f088, // n0x11d6 c0x0000 (---------------) + I langevag 0x002bbf86, // n0x11d7 c0x0000 (---------------) + I lardal 0x0031e486, // n0x11d8 c0x0000 (---------------) + I larvik 0x00327587, // n0x11d9 c0x0000 (---------------) + I lavagis 0x00328588, // n0x11da c0x0000 (---------------) + I lavangen 0x0034ee0b, // n0x11db c0x0000 (---------------) + I leangaviika 0x002cb0c7, // n0x11dc c0x0000 (---------------) + I lebesby 0x00281049, // n0x11dd c0x0000 (---------------) + I leikanger 0x00284e09, // n0x11de c0x0000 (---------------) + I leirfjord 0x0020aec7, // n0x11df c0x0000 (---------------) + I leirvik 0x002a6684, // n0x11e0 c0x0000 (---------------) + I leka 0x002c2847, // n0x11e1 c0x0000 (---------------) + I leksvik 0x002da106, // n0x11e2 c0x0000 (---------------) + I lenvik 0x002415c6, // n0x11e3 c0x0000 (---------------) + I lerdal 0x00222845, // n0x11e4 c0x0000 (---------------) + I lesja 0x002de248, // n0x11e5 c0x0000 (---------------) + I levanger 0x002f9944, // n0x11e6 c0x0000 (---------------) + I lier 0x002f9946, // n0x11e7 c0x0000 (---------------) + I lierne 0x00236a8b, // n0x11e8 c0x0000 (---------------) + I lillehammer 0x002db709, // n0x11e9 c0x0000 (---------------) + I lillesand 0x002d8a46, // n0x11ea c0x0000 (---------------) + I lindas 0x0034f549, // n0x11eb c0x0000 (---------------) + I lindesnes 0x00211ac6, // n0x11ec c0x0000 (---------------) + I loabat 0x00246b48, // n0x11ed c0x0000 (---------------) + I lodingen 0x002f1903, // n0x11ee c0x0000 (---------------) + I lom 0x0021ef45, // n0x11ef c0x0000 (---------------) + I loppa 0x002c22c9, // n0x11f0 c0x0000 (---------------) + I lorenskog 0x0020c905, // n0x11f1 c0x0000 (---------------) + I loten 0x002d4344, // n0x11f2 c0x0000 (---------------) + I lund 0x0025cb06, // n0x11f3 c0x0000 (---------------) + I lunner 0x00226045, // n0x11f4 c0x0000 (---------------) + I luroy 0x00228086, // n0x11f5 c0x0000 (---------------) + I luster 0x002e6107, // n0x11f6 c0x0000 (---------------) + I lyngdal 0x00308a46, // n0x11f7 c0x0000 (---------------) + I lyngen 0x0027ebcb, // n0x11f8 c0x0000 (---------------) + I malatvuopmi 0x0034f207, // n0x11f9 c0x0000 (---------------) + I malselv 0x003099c6, // n0x11fa c0x0000 (---------------) + I malvik 0x003327c6, // n0x11fb c0x0000 (---------------) + I mandal 0x0024e106, // n0x11fc c0x0000 (---------------) + I marker 0x0024a709, // n0x11fd c0x0000 (---------------) + I marnardal 0x00293d0a, // n0x11fe c0x0000 (---------------) + I masfjorden 0x0031d605, // n0x11ff c0x0000 (---------------) + I masoy 0x002b050d, // n0x1200 c0x0000 (---------------) + I matta-varjjat 0x00288546, // n0x1201 c0x0000 (---------------) + I meland 0x002492c6, // n0x1202 c0x0000 (---------------) + I meldal 0x00254106, // n0x1203 c0x0000 (---------------) + I melhus 0x00249ec5, // n0x1204 c0x0000 (---------------) + I meloy 0x0026eb47, // n0x1205 c0x0000 (---------------) + I meraker 0x00227a87, // n0x1206 c0x0000 (---------------) + I midsund 0x0027adce, // n0x1207 c0x0000 (---------------) + I midtre-gauldal 0x0025f683, // n0x1208 c0x0000 (---------------) + I mil 0x002abc89, // n0x1209 c0x0000 (---------------) + I mjondalen 0x00291c09, // n0x120a c0x0000 (---------------) + I mo-i-rana 0x002ed807, // n0x120b c0x0000 (---------------) + I moareke 0x00331387, // n0x120c c0x0000 (---------------) + I modalen 0x00296b45, // n0x120d c0x0000 (---------------) + I modum 0x00210545, // n0x120e c0x0000 (---------------) + I molde 0x376d86cf, // n0x120f c0x00dd (n0x13bd-n0x13bf) o I more-og-romsdal 0x002b0dc7, // n0x1210 c0x0000 (---------------) + I mosjoen 0x002b0f88, // n0x1211 c0x0000 (---------------) + I moskenes 0x002b1904, // n0x1212 c0x0000 (---------------) + I moss 0x002b1c06, // n0x1213 c0x0000 (---------------) + I mosvik 0x37a3d382, // n0x1214 c0x00de (n0x13bf-n0x13c0) + I mr 0x002b4546, // n0x1215 c0x0000 (---------------) + I muosat 0x002b9786, // n0x1216 c0x0000 (---------------) + I museum 0x00291dce, // n0x1217 c0x0000 (---------------) + I naamesjevuemie 0x003245ca, // n0x1218 c0x0000 (---------------) + I namdalseid 0x0025cf06, // n0x1219 c0x0000 (---------------) + I namsos 0x002f21ca, // n0x121a c0x0000 (---------------) + I namsskogan 0x00342a49, // n0x121b c0x0000 (---------------) + I nannestad 0x0033b545, // n0x121c c0x0000 (---------------) + I naroy 0x002f9f08, // n0x121d c0x0000 (---------------) + I narviika 0x002f80c6, // n0x121e c0x0000 (---------------) + I narvik 0x00209ac8, // n0x121f c0x0000 (---------------) + I naustdal 0x0020fe08, // n0x1220 c0x0000 (---------------) + I navuotna 0x0029190b, // n0x1221 c0x0000 (---------------) + I nedre-eiker 0x002211c5, // n0x1222 c0x0000 (---------------) + I nesna 0x002f8a48, // n0x1223 c0x0000 (---------------) + I nesodden 0x0020d14c, // n0x1224 c0x0000 (---------------) + I nesoddtangen 0x00213f47, // n0x1225 c0x0000 (---------------) + I nesseby 0x00351206, // n0x1226 c0x0000 (---------------) + I nesset 0x0022cf08, // n0x1227 c0x0000 (---------------) + I nissedal 0x00203488, // n0x1228 c0x0000 (---------------) + I nittedal 0x37e31642, // n0x1229 c0x00df (n0x13c0-n0x13c1) + I nl 0x00232c8b, // n0x122a c0x0000 (---------------) + I nord-aurdal 0x002ffc89, // n0x122b c0x0000 (---------------) + I nord-fron 0x002ecd09, // n0x122c c0x0000 (---------------) + I nord-odal 0x002eda07, // n0x122d c0x0000 (---------------) + I norddal 0x0031cc48, // n0x122e c0x0000 (---------------) + I nordkapp 0x38210e88, // n0x122f c0x00e0 (n0x13c1-n0x13c5) o I nordland 0x002161cb, // n0x1230 c0x0000 (---------------) + I nordre-land 0x00254bc9, // n0x1231 c0x0000 (---------------) + I nordreisa 0x003045cd, // n0x1232 c0x0000 (---------------) + I nore-og-uvdal 0x00210088, // n0x1233 c0x0000 (---------------) + I notodden 0x00305948, // n0x1234 c0x0000 (---------------) + I notteroy 0x38604e02, // n0x1235 c0x00e1 (n0x13c5-n0x13c6) + I nt 0x003105c4, // n0x1236 c0x0000 (---------------) + I odda 0x38a16f82, // n0x1237 c0x00e2 (n0x13c6-n0x13c7) + I of 0x002760c6, // n0x1238 c0x0000 (---------------) + I oksnes 0x38e051c2, // n0x1239 c0x00e3 (n0x13c7-n0x13c8) + I ol 0x002d448a, // n0x123a c0x0000 (---------------) + I omasvuotna 0x00227f46, // n0x123b c0x0000 (---------------) + I oppdal 0x00229688, // n0x123c c0x0000 (---------------) + I oppegard 0x00222a88, // n0x123d c0x0000 (---------------) + I orkanger 0x0022ba86, // n0x123e c0x0000 (---------------) + I orkdal 0x00258986, // n0x123f c0x0000 (---------------) + I orland 0x002c6fc6, // n0x1240 c0x0000 (---------------) + I orskog 0x00262905, // n0x1241 c0x0000 (---------------) + I orsta 0x00237b44, // n0x1242 c0x0000 (---------------) + I osen 0x3921eec4, // n0x1243 c0x00e4 (n0x13c8-n0x13c9) + I oslo 0x0029d006, // n0x1244 c0x0000 (---------------) + I osoyro 0x002a8dc7, // n0x1245 c0x0000 (---------------) + I osteroy 0x396e1847, // n0x1246 c0x00e5 (n0x13c9-n0x13ca) o I ostfold 0x0027478b, // n0x1247 c0x0000 (---------------) + I ostre-toten 0x00270e09, // n0x1248 c0x0000 (---------------) + I overhalla 0x0032fd4a, // n0x1249 c0x0000 (---------------) + I ovre-eiker 0x00344344, // n0x124a c0x0000 (---------------) + I oyer 0x002b7188, // n0x124b c0x0000 (---------------) + I oygarden 0x0029e98d, // n0x124c c0x0000 (---------------) + I oystre-slidre 0x002c3b49, // n0x124d c0x0000 (---------------) + I porsanger 0x002c3d88, // n0x124e c0x0000 (---------------) + I porsangu 0x002c4049, // n0x124f c0x0000 (---------------) + I porsgrunn 0x002c5804, // n0x1250 c0x0000 (---------------) + I priv 0x0024cd44, // n0x1251 c0x0000 (---------------) + I rade 0x00264fc5, // n0x1252 c0x0000 (---------------) + I radoy 0x002fa94b, // n0x1253 c0x0000 (---------------) + I rahkkeravju 0x00345986, // n0x1254 c0x0000 (---------------) + I raholt 0x0029ce45, // n0x1255 c0x0000 (---------------) + I raisa 0x00279f09, // n0x1256 c0x0000 (---------------) + I rakkestad 0x002213c8, // n0x1257 c0x0000 (---------------) + I ralingen 0x00285504, // n0x1258 c0x0000 (---------------) + I rana 0x002ed589, // n0x1259 c0x0000 (---------------) + I randaberg 0x002bff45, // n0x125a c0x0000 (---------------) + I rauma 0x002d9fc8, // n0x125b c0x0000 (---------------) + I rendalen 0x00240dc7, // n0x125c c0x0000 (---------------) + I rennebu 0x002b7008, // n0x125d c0x0000 (---------------) + I rennesoy 0x002cc606, // n0x125e c0x0000 (---------------) + I rindal 0x00233e47, // n0x125f c0x0000 (---------------) + I ringebu 0x002a9e49, // n0x1260 c0x0000 (---------------) + I ringerike 0x00223089, // n0x1261 c0x0000 (---------------) + I ringsaker 0x0024bcc5, // n0x1262 c0x0000 (---------------) + I risor 0x00259a45, // n0x1263 c0x0000 (---------------) + I rissa 0x39a03942, // n0x1264 c0x00e6 (n0x13ca-n0x13cb) + I rl 0x002c7684, // n0x1265 c0x0000 (---------------) + I roan 0x0029e8c5, // n0x1266 c0x0000 (---------------) + I rodoy 0x003072c6, // n0x1267 c0x0000 (---------------) + I rollag 0x002d4ec5, // n0x1268 c0x0000 (---------------) + I romsa 0x0022c5c7, // n0x1269 c0x0000 (---------------) + I romskog 0x0021b485, // n0x126a c0x0000 (---------------) + I roros 0x0025ec84, // n0x126b c0x0000 (---------------) + I rost 0x002a8ec6, // n0x126c c0x0000 (---------------) + I royken 0x0023eb07, // n0x126d c0x0000 (---------------) + I royrvik 0x0023d3c6, // n0x126e c0x0000 (---------------) + I ruovat 0x00234d85, // n0x126f c0x0000 (---------------) + I rygge 0x00229308, // n0x1270 c0x0000 (---------------) + I salangen 0x0022f585, // n0x1271 c0x0000 (---------------) + I salat 0x002316c7, // n0x1272 c0x0000 (---------------) + I saltdal 0x00242589, // n0x1273 c0x0000 (---------------) + I samnanger 0x0029a50a, // n0x1274 c0x0000 (---------------) + I sandefjord 0x0026db47, // n0x1275 c0x0000 (---------------) + I sandnes 0x0026db4c, // n0x1276 c0x0000 (---------------) + I sandnessjoen 0x00223686, // n0x1277 c0x0000 (---------------) + I sandoy 0x00269049, // n0x1278 c0x0000 (---------------) + I sarpsborg 0x00285e85, // n0x1279 c0x0000 (---------------) + I sauda 0x00286b48, // n0x127a c0x0000 (---------------) + I sauherad 0x00222103, // n0x127b c0x0000 (---------------) + I sel 0x00318305, // n0x127c c0x0000 (---------------) + I selbu 0x0031ba45, // n0x127d c0x0000 (---------------) + I selje 0x003514c7, // n0x127e c0x0000 (---------------) + I seljord 0x39e38cc2, // n0x127f c0x00e7 (n0x13cb-n0x13cc) + I sf 0x00219e07, // n0x1280 c0x0000 (---------------) + I siellak 0x002d3286, // n0x1281 c0x0000 (---------------) + I sigdal 0x002192c6, // n0x1282 c0x0000 (---------------) + I siljan 0x002d3c06, // n0x1283 c0x0000 (---------------) + I sirdal 0x002033c6, // n0x1284 c0x0000 (---------------) + I skanit 0x0028e348, // n0x1285 c0x0000 (---------------) + I skanland 0x002f4745, // n0x1286 c0x0000 (---------------) + I skaun 0x0031bd07, // n0x1287 c0x0000 (---------------) + I skedsmo 0x0031bd0d, // n0x1288 c0x0000 (---------------) + I skedsmokorset 0x0021dac3, // n0x1289 c0x0000 (---------------) + I ski 0x0021dac5, // n0x128a c0x0000 (---------------) + I skien 0x003531c7, // n0x128b c0x0000 (---------------) + I skierva 0x002c65c8, // n0x128c c0x0000 (---------------) + I skiptvet 0x002797c5, // n0x128d c0x0000 (---------------) + I skjak 0x002f8ec8, // n0x128e c0x0000 (---------------) + I skjervoy 0x0025d406, // n0x128f c0x0000 (---------------) + I skodje 0x00248947, // n0x1290 c0x0000 (---------------) + I slattum 0x00288885, // n0x1291 c0x0000 (---------------) + I smola 0x00221246, // n0x1292 c0x0000 (---------------) + I snaase 0x00225045, // n0x1293 c0x0000 (---------------) + I snasa 0x0022abca, // n0x1294 c0x0000 (---------------) + I snillfjord 0x002a3a06, // n0x1295 c0x0000 (---------------) + I snoasa 0x0025c287, // n0x1296 c0x0000 (---------------) + I sogndal 0x0026b4c5, // n0x1297 c0x0000 (---------------) + I sogne 0x002d0807, // n0x1298 c0x0000 (---------------) + I sokndal 0x002b8f44, // n0x1299 c0x0000 (---------------) + I sola 0x002d42c6, // n0x129a c0x0000 (---------------) + I solund 0x002d4885, // n0x129b c0x0000 (---------------) + I somna 0x00216b4b, // n0x129c c0x0000 (---------------) + I sondre-land 0x003082c9, // n0x129d c0x0000 (---------------) + I songdalen 0x0025730a, // n0x129e c0x0000 (---------------) + I sor-aurdal 0x0024bd48, // n0x129f c0x0000 (---------------) + I sor-fron 0x002d5748, // n0x12a0 c0x0000 (---------------) + I sor-odal 0x002d594c, // n0x12a1 c0x0000 (---------------) + I sor-varanger 0x002d5c47, // n0x12a2 c0x0000 (---------------) + I sorfold 0x002d5e08, // n0x12a3 c0x0000 (---------------) + I sorreisa 0x002d6cc8, // n0x12a4 c0x0000 (---------------) + I sortland 0x002d6ec5, // n0x12a5 c0x0000 (---------------) + I sorum 0x002d970a, // n0x12a6 c0x0000 (---------------) + I spjelkavik 0x002d9c89, // n0x12a7 c0x0000 (---------------) + I spydeberg 0x3a202482, // n0x12a8 c0x00e8 (n0x13cc-n0x13cd) + I st 0x002d2e86, // n0x12a9 c0x0000 (---------------) + I stange 0x0026f004, // n0x12aa c0x0000 (---------------) + I stat 0x00284c49, // n0x12ab c0x0000 (---------------) + I stathelle 0x00301d09, // n0x12ac c0x0000 (---------------) + I stavanger 0x00248507, // n0x12ad c0x0000 (---------------) + I stavern 0x002966c7, // n0x12ae c0x0000 (---------------) + I steigen 0x002dc009, // n0x12af c0x0000 (---------------) + I steinkjer 0x002dcbc8, // n0x12b0 c0x0000 (---------------) + I stjordal 0x002dcbcf, // n0x12b1 c0x0000 (---------------) + I stjordalshalsen 0x00290a06, // n0x12b2 c0x0000 (---------------) + I stokke 0x002dd38b, // n0x12b3 c0x0000 (---------------) + I stor-elvdal 0x002dd645, // n0x12b4 c0x0000 (---------------) + I stord 0x002dd647, // n0x12b5 c0x0000 (---------------) + I stordal 0x002dda89, // n0x12b6 c0x0000 (---------------) + I storfjord 0x002dd206, // n0x12b7 c0x0000 (---------------) + I strand 0x002ed507, // n0x12b8 c0x0000 (---------------) + I stranda 0x0033ed85, // n0x12b9 c0x0000 (---------------) + I stryn 0x00232684, // n0x12ba c0x0000 (---------------) + I sula 0x00203106, // n0x12bb c0x0000 (---------------) + I suldal 0x0021f704, // n0x12bc c0x0000 (---------------) + I sund 0x002a3347, // n0x12bd c0x0000 (---------------) + I sunndal 0x0032cc88, // n0x12be c0x0000 (---------------) + I surnadal 0x3a6df5c8, // n0x12bf c0x00e9 (n0x13cd-n0x13ce) + I svalbard 0x002dfa05, // n0x12c0 c0x0000 (---------------) + I sveio 0x002dfb47, // n0x12c1 c0x0000 (---------------) + I svelvik 0x0028af49, // n0x12c2 c0x0000 (---------------) + I sykkylven 0x00282104, // n0x12c3 c0x0000 (---------------) + I tana 0x002d9a88, // n0x12c4 c0x0000 (---------------) + I tananger 0x3aad2648, // n0x12c5 c0x00ea (n0x13ce-n0x13d0) o I telemark 0x00253384, // n0x12c6 c0x0000 (---------------) + I time 0x00233a88, // n0x12c7 c0x0000 (---------------) + I tingvoll 0x002f8004, // n0x12c8 c0x0000 (---------------) + I tinn 0x0023fb89, // n0x12c9 c0x0000 (---------------) + I tjeldsund 0x00249e05, // n0x12ca c0x0000 (---------------) + I tjome 0x3ae3d502, // n0x12cb c0x00eb (n0x13d0-n0x13d1) + I tm 0x00290a45, // n0x12cc c0x0000 (---------------) + I tokke 0x0021ac85, // n0x12cd c0x0000 (---------------) + I tolga 0x00306588, // n0x12ce c0x0000 (---------------) + I tonsberg 0x00235347, // n0x12cf c0x0000 (---------------) + I torsken 0x3b209942, // n0x12d0 c0x00ec (n0x13d1-n0x13d2) + I tr 0x002b27c5, // n0x12d1 c0x0000 (---------------) + I trana 0x002dad06, // n0x12d2 c0x0000 (---------------) + I tranby 0x00326d46, // n0x12d3 c0x0000 (---------------) + I tranoy 0x002c7648, // n0x12d4 c0x0000 (---------------) + I troandin 0x002e4b08, // n0x12d5 c0x0000 (---------------) + I trogstad 0x002d4e86, // n0x12d6 c0x0000 (---------------) + I tromsa 0x002d8246, // n0x12d7 c0x0000 (---------------) + I tromso 0x00236fc9, // n0x12d8 c0x0000 (---------------) + I trondheim 0x002f5086, // n0x12d9 c0x0000 (---------------) + I trysil 0x0034768b, // n0x12da c0x0000 (---------------) + I tvedestrand 0x00225f45, // n0x12db c0x0000 (---------------) + I tydal 0x0020efc6, // n0x12dc c0x0000 (---------------) + I tynset 0x00238c48, // n0x12dd c0x0000 (---------------) + I tysfjord 0x002fe346, // n0x12de c0x0000 (---------------) + I tysnes 0x00296ec6, // n0x12df c0x0000 (---------------) + I tysvar 0x002be70a, // n0x12e0 c0x0000 (---------------) + I ullensaker 0x0035080a, // n0x12e1 c0x0000 (---------------) + I ullensvang 0x00255105, // n0x12e2 c0x0000 (---------------) + I ulvik 0x00266287, // n0x12e3 c0x0000 (---------------) + I unjarga 0x0025bc06, // n0x12e4 c0x0000 (---------------) + I utsira 0x3b602b82, // n0x12e5 c0x00ed (n0x13d2-n0x13d3) + I va 0x00353307, // n0x12e6 c0x0000 (---------------) + I vaapste 0x0025c1c5, // n0x12e7 c0x0000 (---------------) + I vadso 0x002bbb44, // n0x12e8 c0x0000 (---------------) + I vaga 0x002bbb45, // n0x12e9 c0x0000 (---------------) + I vagan 0x0023f1c6, // n0x12ea c0x0000 (---------------) + I vagsoy 0x002875c7, // n0x12eb c0x0000 (---------------) + I vaksdal 0x00218845, // n0x12ec c0x0000 (---------------) + I valle 0x002de2c4, // n0x12ed c0x0000 (---------------) + I vang 0x0021f108, // n0x12ee c0x0000 (---------------) + I vanylven 0x00296f85, // n0x12ef c0x0000 (---------------) + I vardo 0x002f4f07, // n0x12f0 c0x0000 (---------------) + I varggat 0x00207d05, // n0x12f1 c0x0000 (---------------) + I varoy 0x0022ab05, // n0x12f2 c0x0000 (---------------) + I vefsn 0x002937c4, // n0x12f3 c0x0000 (---------------) + I vega 0x002937c9, // n0x12f4 c0x0000 (---------------) + I vegarshei 0x0025aa48, // n0x12f5 c0x0000 (---------------) + I vennesla 0x00337bc6, // n0x12f6 c0x0000 (---------------) + I verdal 0x00261646, // n0x12f7 c0x0000 (---------------) + I verran 0x002f5d46, // n0x12f8 c0x0000 (---------------) + I vestby 0x3bad4008, // n0x12f9 c0x00ee (n0x13d3-n0x13d4) o I vestfold 0x002daf07, // n0x12fa c0x0000 (---------------) + I vestnes 0x0034af0d, // n0x12fb c0x0000 (---------------) + I vestre-slidre 0x002e140c, // n0x12fc c0x0000 (---------------) + I vestre-toten 0x002e1a09, // n0x12fd c0x0000 (---------------) + I vestvagoy 0x002e1c49, // n0x12fe c0x0000 (---------------) + I vevelstad 0x3bf15ac2, // n0x12ff c0x00ef (n0x13d4-n0x13d5) + I vf 0x0034a443, // n0x1300 c0x0000 (---------------) + I vgs 0x0020afc3, // n0x1301 c0x0000 (---------------) + I vik 0x0023ec05, // n0x1302 c0x0000 (---------------) + I vikna 0x0032048a, // n0x1303 c0x0000 (---------------) + I vindafjord 0x002f4d46, // n0x1304 c0x0000 (---------------) + I voagat 0x0022e705, // n0x1305 c0x0000 (---------------) + I volda 0x002e6644, // n0x1306 c0x0000 (---------------) + I voss 0x002e664b, // n0x1307 c0x0000 (---------------) + I vossevangen 0x002e82cc, // n0x1308 c0x0000 (---------------) + I xn--andy-ira 0x002e92cc, // n0x1309 c0x0000 (---------------) + I xn--asky-ira 0x002e95d5, // n0x130a c0x0000 (---------------) + I xn--aurskog-hland-jnb 0x002edf8d, // n0x130b c0x0000 (---------------) + I xn--avery-yua 0x002ee70f, // n0x130c c0x0000 (---------------) + I xn--bdddj-mrabd 0x002eead2, // n0x130d c0x0000 (---------------) + I xn--bearalvhki-y4a 0x002eef4f, // n0x130e c0x0000 (---------------) + I xn--berlevg-jxa 0x002ef312, // n0x130f c0x0000 (---------------) + I xn--bhcavuotna-s4a 0x002ef793, // n0x1310 c0x0000 (---------------) + I xn--bhccavuotna-k7a 0x002efc4d, // n0x1311 c0x0000 (---------------) + I xn--bidr-5nac 0x002f020d, // n0x1312 c0x0000 (---------------) + I xn--bievt-0qa 0x002f054e, // n0x1313 c0x0000 (---------------) + I xn--bjarky-fya 0x002f0c8e, // n0x1314 c0x0000 (---------------) + I xn--bjddar-pta 0x002f118c, // n0x1315 c0x0000 (---------------) + I xn--blt-elab 0x002f150c, // n0x1316 c0x0000 (---------------) + I xn--bmlo-gra 0x002f1f8b, // n0x1317 c0x0000 (---------------) + I xn--bod-2na 0x002f268e, // n0x1318 c0x0000 (---------------) + I xn--brnny-wuac 0x002f3cd2, // n0x1319 c0x0000 (---------------) + I xn--brnnysund-m8ac 0x002f4b0c, // n0x131a c0x0000 (---------------) + I xn--brum-voa 0x002f54d0, // n0x131b c0x0000 (---------------) + I xn--btsfjord-9za 0x002fd292, // n0x131c c0x0000 (---------------) + I xn--davvenjrga-y4a 0x002fd70c, // n0x131d c0x0000 (---------------) + I xn--dnna-gra 0x002fe84d, // n0x131e c0x0000 (---------------) + I xn--drbak-wua 0x002feb8c, // n0x131f c0x0000 (---------------) + I xn--dyry-ira 0x002fee91, // n0x1320 c0x0000 (---------------) + I xn--eveni-0qa01ga 0x002ff2cd, // n0x1321 c0x0000 (---------------) + I xn--finny-yua 0x00301f4d, // n0x1322 c0x0000 (---------------) + I xn--fjord-lra 0x0030228a, // n0x1323 c0x0000 (---------------) + I xn--fl-zia 0x0030250c, // n0x1324 c0x0000 (---------------) + I xn--flor-jra 0x00302b4c, // n0x1325 c0x0000 (---------------) + I xn--frde-gra 0x00302ecc, // n0x1326 c0x0000 (---------------) + I xn--frna-woa 0x00303c4c, // n0x1327 c0x0000 (---------------) + I xn--frya-hra 0x003053d3, // n0x1328 c0x0000 (---------------) + I xn--ggaviika-8ya47h 0x00305b50, // n0x1329 c0x0000 (---------------) + I xn--gildeskl-g0a 0x00305f50, // n0x132a c0x0000 (---------------) + I xn--givuotna-8ya 0x0030678d, // n0x132b c0x0000 (---------------) + I xn--gjvik-wua 0x00306acc, // n0x132c c0x0000 (---------------) + I xn--gls-elac 0x00308789, // n0x132d c0x0000 (---------------) + I xn--h-2fa 0x0030a50d, // n0x132e c0x0000 (---------------) + I xn--hbmer-xqa 0x0030a853, // n0x132f c0x0000 (---------------) + I xn--hcesuolo-7ya35b 0x0030bb51, // n0x1330 c0x0000 (---------------) + I xn--hgebostad-g3a 0x0030bf93, // n0x1331 c0x0000 (---------------) + I xn--hmmrfeasta-s4ac 0x0030ce8f, // n0x1332 c0x0000 (---------------) + I xn--hnefoss-q1a 0x0030d24c, // n0x1333 c0x0000 (---------------) + I xn--hobl-ira 0x0030d54f, // n0x1334 c0x0000 (---------------) + I xn--holtlen-hxa 0x0030d90d, // n0x1335 c0x0000 (---------------) + I xn--hpmir-xqa 0x0030dc4f, // n0x1336 c0x0000 (---------------) + I xn--hyanger-q1a 0x0030e010, // n0x1337 c0x0000 (---------------) + I xn--hylandet-54a 0x0030e40e, // n0x1338 c0x0000 (---------------) + I xn--indery-fya 0x00310ece, // n0x1339 c0x0000 (---------------) + I xn--jlster-bya 0x003118d0, // n0x133a c0x0000 (---------------) + I xn--jrpeland-54a 0x00311ccd, // n0x133b c0x0000 (---------------) + I xn--karmy-yua 0x0031200e, // n0x133c c0x0000 (---------------) + I xn--kfjord-iua 0x0031238c, // n0x133d c0x0000 (---------------) + I xn--klbu-woa 0x00312693, // n0x133e c0x0000 (---------------) + I xn--koluokta-7ya57h 0x0031318e, // n0x133f c0x0000 (---------------) + I xn--krager-gya 0x003143d0, // n0x1340 c0x0000 (---------------) + I xn--kranghke-b0a 0x003147d1, // n0x1341 c0x0000 (---------------) + I xn--krdsherad-m8a 0x00314c0f, // n0x1342 c0x0000 (---------------) + I xn--krehamn-dxa 0x00314fd3, // n0x1343 c0x0000 (---------------) + I xn--krjohka-hwab49j 0x0031564d, // n0x1344 c0x0000 (---------------) + I xn--ksnes-uua 0x0031598f, // n0x1345 c0x0000 (---------------) + I xn--kvfjord-nxa 0x00315d4e, // n0x1346 c0x0000 (---------------) + I xn--kvitsy-fya 0x00316310, // n0x1347 c0x0000 (---------------) + I xn--kvnangen-k0a 0x00316709, // n0x1348 c0x0000 (---------------) + I xn--l-1fa 0x00316e10, // n0x1349 c0x0000 (---------------) + I xn--laheadju-7ya 0x0031740f, // n0x134a c0x0000 (---------------) + I xn--langevg-jxa 0x00317a8f, // n0x134b c0x0000 (---------------) + I xn--ldingen-q1a 0x00317e52, // n0x134c c0x0000 (---------------) + I xn--leagaviika-52b 0x0031aa0e, // n0x134d c0x0000 (---------------) + I xn--lesund-hua 0x0031b2cd, // n0x134e c0x0000 (---------------) + I xn--lgrd-poac 0x0031d74d, // n0x134f c0x0000 (---------------) + I xn--lhppi-xqa 0x0031da8d, // n0x1350 c0x0000 (---------------) + I xn--linds-pra 0x0031ec8d, // n0x1351 c0x0000 (---------------) + I xn--loabt-0qa 0x0031efcd, // n0x1352 c0x0000 (---------------) + I xn--lrdal-sra 0x0031f310, // n0x1353 c0x0000 (---------------) + I xn--lrenskog-54a 0x0031f70b, // n0x1354 c0x0000 (---------------) + I xn--lt-liac 0x0032014c, // n0x1355 c0x0000 (---------------) + I xn--lten-gra 0x0032070c, // n0x1356 c0x0000 (---------------) + I xn--lury-ira 0x00320a0c, // n0x1357 c0x0000 (---------------) + I xn--mely-ira 0x00320d0e, // n0x1358 c0x0000 (---------------) + I xn--merker-kua 0x00326410, // n0x1359 c0x0000 (---------------) + I xn--mjndalen-64a 0x00326ed2, // n0x135a c0x0000 (---------------) + I xn--mlatvuopmi-s4a 0x0032734b, // n0x135b c0x0000 (---------------) + I xn--mli-tla 0x003277ce, // n0x135c c0x0000 (---------------) + I xn--mlselv-iua 0x00327b4e, // n0x135d c0x0000 (---------------) + I xn--moreke-jua 0x00327ece, // n0x135e c0x0000 (---------------) + I xn--mosjen-eya 0x0032834b, // n0x135f c0x0000 (---------------) + I xn--mot-tla 0x3c328796, // n0x1360 c0x00f0 (n0x13d5-n0x13d7) o I xn--mre-og-romsdal-qqb 0x00328f0d, // n0x1361 c0x0000 (---------------) + I xn--msy-ula0h 0x00329a94, // n0x1362 c0x0000 (---------------) + I xn--mtta-vrjjat-k7af 0x0032a10d, // n0x1363 c0x0000 (---------------) + I xn--muost-0qa 0x0032ad55, // n0x1364 c0x0000 (---------------) + I xn--nmesjevuemie-tcba 0x0032be0d, // n0x1365 c0x0000 (---------------) + I xn--nry-yla5g 0x0032c14f, // n0x1366 c0x0000 (---------------) + I xn--nttery-byae 0x0032ce8f, // n0x1367 c0x0000 (---------------) + I xn--nvuotna-hwa 0x0032eb4f, // n0x1368 c0x0000 (---------------) + I xn--oppegrd-ixa 0x0032ef0e, // n0x1369 c0x0000 (---------------) + I xn--ostery-fya 0x0032f48d, // n0x136a c0x0000 (---------------) + I xn--osyro-wua 0x00330451, // n0x136b c0x0000 (---------------) + I xn--porsgu-sta26f 0x00331a0c, // n0x136c c0x0000 (---------------) + I xn--rady-ira 0x00331d0c, // n0x136d c0x0000 (---------------) + I xn--rdal-poa 0x0033200b, // n0x136e c0x0000 (---------------) + I xn--rde-ula 0x003322cc, // n0x136f c0x0000 (---------------) + I xn--rdy-0nab 0x0033294f, // n0x1370 c0x0000 (---------------) + I xn--rennesy-v1a 0x00332d12, // n0x1371 c0x0000 (---------------) + I xn--rhkkervju-01af 0x0033370d, // n0x1372 c0x0000 (---------------) + I xn--rholt-mra 0x0033420c, // n0x1373 c0x0000 (---------------) + I xn--risa-5na 0x003346cc, // n0x1374 c0x0000 (---------------) + I xn--risr-ira 0x003349cd, // n0x1375 c0x0000 (---------------) + I xn--rland-uua 0x00334d0f, // n0x1376 c0x0000 (---------------) + I xn--rlingen-mxa 0x003350ce, // n0x1377 c0x0000 (---------------) + I xn--rmskog-bya 0x0033544c, // n0x1378 c0x0000 (---------------) + I xn--rros-gra 0x003358cd, // n0x1379 c0x0000 (---------------) + I xn--rskog-uua 0x00335c0b, // n0x137a c0x0000 (---------------) + I xn--rst-0na 0x00336a8c, // n0x137b c0x0000 (---------------) + I xn--rsta-fra 0x0033700d, // n0x137c c0x0000 (---------------) + I xn--ryken-vua 0x0033734e, // n0x137d c0x0000 (---------------) + I xn--ryrvik-bya 0x003376c9, // n0x137e c0x0000 (---------------) + I xn--s-1fa 0x00338893, // n0x137f c0x0000 (---------------) + I xn--sandnessjen-ogb 0x003395cd, // n0x1380 c0x0000 (---------------) + I xn--sandy-yua 0x0033990d, // n0x1381 c0x0000 (---------------) + I xn--seral-lra 0x00339c4c, // n0x1382 c0x0000 (---------------) + I xn--sgne-gra 0x00339f8e, // n0x1383 c0x0000 (---------------) + I xn--skierv-uta 0x0033a50f, // n0x1384 c0x0000 (---------------) + I xn--skjervy-v1a 0x0033a8cc, // n0x1385 c0x0000 (---------------) + I xn--skjk-soa 0x0033abcd, // n0x1386 c0x0000 (---------------) + I xn--sknit-yqa 0x0033af0f, // n0x1387 c0x0000 (---------------) + I xn--sknland-fxa 0x0033b2cc, // n0x1388 c0x0000 (---------------) + I xn--slat-5na 0x0033b68c, // n0x1389 c0x0000 (---------------) + I xn--slt-elab 0x0033ba4c, // n0x138a c0x0000 (---------------) + I xn--smla-hra 0x0033bd4c, // n0x138b c0x0000 (---------------) + I xn--smna-gra 0x0033c04d, // n0x138c c0x0000 (---------------) + I xn--snase-nra 0x0033c392, // n0x138d c0x0000 (---------------) + I xn--sndre-land-0cb 0x0033c84c, // n0x138e c0x0000 (---------------) + I xn--snes-poa 0x0033cb4c, // n0x138f c0x0000 (---------------) + I xn--snsa-roa 0x0033ce51, // n0x1390 c0x0000 (---------------) + I xn--sr-aurdal-l8a 0x0033d28f, // n0x1391 c0x0000 (---------------) + I xn--sr-fron-q1a 0x0033d64f, // n0x1392 c0x0000 (---------------) + I xn--sr-odal-q1a 0x0033da13, // n0x1393 c0x0000 (---------------) + I xn--sr-varanger-ggb 0x0033fe0e, // n0x1394 c0x0000 (---------------) + I xn--srfold-bya 0x0034018f, // n0x1395 c0x0000 (---------------) + I xn--srreisa-q1a 0x0034054c, // n0x1396 c0x0000 (---------------) + I xn--srum-gra 0x3c74084e, // n0x1397 c0x00f1 (n0x13d7-n0x13d8) o I xn--stfold-9xa 0x00340bcf, // n0x1398 c0x0000 (---------------) + I xn--stjrdal-s1a 0x00340f96, // n0x1399 c0x0000 (---------------) + I xn--stjrdalshalsen-sqb 0x00341d92, // n0x139a c0x0000 (---------------) + I xn--stre-toten-zcb 0x003434cc, // n0x139b c0x0000 (---------------) + I xn--tjme-hra 0x0034604f, // n0x139c c0x0000 (---------------) + I xn--tnsberg-q1a 0x0034640d, // n0x139d c0x0000 (---------------) + I xn--trany-yua 0x0034674f, // n0x139e c0x0000 (---------------) + I xn--trgstad-r1a 0x00346b0c, // n0x139f c0x0000 (---------------) + I xn--trna-woa 0x00346e0d, // n0x13a0 c0x0000 (---------------) + I xn--troms-zua 0x0034714d, // n0x13a1 c0x0000 (---------------) + I xn--tysvr-vra 0x00347c0e, // n0x13a2 c0x0000 (---------------) + I xn--unjrga-rta 0x0034838c, // n0x13a3 c0x0000 (---------------) + I xn--vads-jra 0x0034868c, // n0x13a4 c0x0000 (---------------) + I xn--vard-jra 0x00348990, // n0x13a5 c0x0000 (---------------) + I xn--vegrshei-c0a 0x00348d91, // n0x13a6 c0x0000 (---------------) + I xn--vestvgy-ixa6o 0x003491cb, // n0x13a7 c0x0000 (---------------) + I xn--vg-yiab 0x0034a04c, // n0x13a8 c0x0000 (---------------) + I xn--vgan-qoa 0x0034a34e, // n0x13a9 c0x0000 (---------------) + I xn--vgsy-qoa0j 0x0034ba51, // n0x13aa c0x0000 (---------------) + I xn--vre-eiker-k8a 0x0034be8e, // n0x13ab c0x0000 (---------------) + I xn--vrggt-xqad 0x0034c20d, // n0x13ac c0x0000 (---------------) + I xn--vry-yla5g 0x0034dc0b, // n0x13ad c0x0000 (---------------) + I xn--yer-zna 0x0034e38f, // n0x13ae c0x0000 (---------------) + I xn--ygarden-p1a 0x0034fa54, // n0x13af c0x0000 (---------------) + I xn--ystre-slidre-ujb 0x00223142, // n0x13b0 c0x0000 (---------------) + I gs 0x00223142, // n0x13b1 c0x0000 (---------------) + I gs 0x0020d143, // n0x13b2 c0x0000 (---------------) + I nes 0x00223142, // n0x13b3 c0x0000 (---------------) + I gs 0x0020d143, // n0x13b4 c0x0000 (---------------) + I nes 0x00223142, // n0x13b5 c0x0000 (---------------) + I gs 0x00209cc2, // n0x13b6 c0x0000 (---------------) + I os 0x0023da85, // n0x13b7 c0x0000 (---------------) + I valer 0x0034b74c, // n0x13b8 c0x0000 (---------------) + I xn--vler-qoa 0x00223142, // n0x13b9 c0x0000 (---------------) + I gs 0x00223142, // n0x13ba c0x0000 (---------------) + I gs 0x00209cc2, // n0x13bb c0x0000 (---------------) + I os 0x00223142, // n0x13bc c0x0000 (---------------) + I gs 0x002781c5, // n0x13bd c0x0000 (---------------) + I heroy 0x0029a505, // n0x13be c0x0000 (---------------) + I sande 0x00223142, // n0x13bf c0x0000 (---------------) + I gs 0x00223142, // n0x13c0 c0x0000 (---------------) + I gs 0x00207c82, // n0x13c1 c0x0000 (---------------) + I bo 0x002781c5, // n0x13c2 c0x0000 (---------------) + I heroy 0x002ee4c9, // n0x13c3 c0x0000 (---------------) + I xn--b-5ga 0x0030b84c, // n0x13c4 c0x0000 (---------------) + I xn--hery-ira 0x00223142, // n0x13c5 c0x0000 (---------------) + I gs 0x00223142, // n0x13c6 c0x0000 (---------------) + I gs 0x00223142, // n0x13c7 c0x0000 (---------------) + I gs 0x00223142, // n0x13c8 c0x0000 (---------------) + I gs 0x0023da85, // n0x13c9 c0x0000 (---------------) + I valer 0x00223142, // n0x13ca c0x0000 (---------------) + I gs 0x00223142, // n0x13cb c0x0000 (---------------) + I gs 0x00223142, // n0x13cc c0x0000 (---------------) + I gs 0x00223142, // n0x13cd c0x0000 (---------------) + I gs 0x00207c82, // n0x13ce c0x0000 (---------------) + I bo 0x002ee4c9, // n0x13cf c0x0000 (---------------) + I xn--b-5ga 0x00223142, // n0x13d0 c0x0000 (---------------) + I gs 0x00223142, // n0x13d1 c0x0000 (---------------) + I gs 0x00223142, // n0x13d2 c0x0000 (---------------) + I gs 0x0029a505, // n0x13d3 c0x0000 (---------------) + I sande 0x00223142, // n0x13d4 c0x0000 (---------------) + I gs 0x0029a505, // n0x13d5 c0x0000 (---------------) + I sande 0x0030b84c, // n0x13d6 c0x0000 (---------------) + I xn--hery-ira 0x0034b74c, // n0x13d7 c0x0000 (---------------) + I xn--vler-qoa 0x002b5183, // n0x13d8 c0x0000 (---------------) + I biz 0x002104c3, // n0x13d9 c0x0000 (---------------) + I com 0x002ceec3, // n0x13da c0x0000 (---------------) + I edu 0x002150c3, // n0x13db c0x0000 (---------------) + I gov 0x002180c4, // n0x13dc c0x0000 (---------------) + I info 0x00239bc3, // n0x13dd c0x0000 (---------------) + I net 0x002453c3, // n0x13de c0x0000 (---------------) + I org 0x00023ec8, // n0x13df c0x0000 (---------------) + merseine 0x000bb704, // n0x13e0 c0x0000 (---------------) + mine 0x000e4948, // n0x13e1 c0x0000 (---------------) + shacknet 0x3d608f82, // n0x13e2 c0x00f5 (n0x13e3-n0x13e4) o I co 0x00031c88, // n0x13e3 c0x0000 (---------------) + blogspot 0x00208f82, // n0x13e4 c0x0000 (---------------) + I co 0x002104c3, // n0x13e5 c0x0000 (---------------) + I com 0x002ceec3, // n0x13e6 c0x0000 (---------------) + I edu 0x002150c3, // n0x13e7 c0x0000 (---------------) + I gov 0x002382c3, // n0x13e8 c0x0000 (---------------) + I med 0x006e290a, // n0x13e9 c0x0001 (---------------) ! I mediaphone 0x002b9786, // n0x13ea c0x0000 (---------------) + I museum 0x00610246, // n0x13eb c0x0001 (---------------) ! I nawras 0x0061024d, // n0x13ec c0x0001 (---------------) ! I nawrastelecom 0x00239bc3, // n0x13ed c0x0000 (---------------) + I net 0x0060acca, // n0x13ee c0x0001 (---------------) ! I omanmobile 0x00614588, // n0x13ef c0x0001 (---------------) ! I omanpost 0x006c52c7, // n0x13f0 c0x0001 (---------------) ! I omantel 0x002453c3, // n0x13f1 c0x0000 (---------------) + I org 0x002c5983, // n0x13f2 c0x0000 (---------------) + I pro 0x006ea80c, // n0x13f3 c0x0001 (---------------) ! I rakpetroleum 0x00689dc7, // n0x13f4 c0x0001 (---------------) ! I siemens 0x0065d688, // n0x13f5 c0x0001 (---------------) ! I songfest 0x006ada0c, // n0x13f6 c0x0001 (---------------) ! I statecouncil 0x00013e42, // n0x13f7 c0x0000 (---------------) + ae 0x0000be47, // n0x13f8 c0x0000 (---------------) + blogdns 0x000bc5c8, // n0x13f9 c0x0000 (---------------) + blogsite 0x0006c052, // n0x13fa c0x0000 (---------------) + boldlygoingnowhere 0x00032888, // n0x13fb c0x0000 (---------------) + dnsalias 0x0005a447, // n0x13fc c0x0000 (---------------) + dnsdojo 0x0002eb4b, // n0x13fd c0x0000 (---------------) + doesntexist 0x0010c549, // n0x13fe c0x0000 (---------------) + dontexist 0x00032787, // n0x13ff c0x0000 (---------------) + doomdns 0x0005a386, // n0x1400 c0x0000 (---------------) + dvrdns 0x00078ac8, // n0x1401 c0x0000 (---------------) + dynalias 0x3e007546, // n0x1402 c0x00f8 (n0x142c-n0x142e) + dyndns 0x0008b5cd, // n0x1403 c0x0000 (---------------) + endofinternet 0x00145b90, // n0x1404 c0x0000 (---------------) + endoftheinternet 0x00050cc7, // n0x1405 c0x0000 (---------------) + from-me 0x00074609, // n0x1406 c0x0000 (---------------) + game-host 0x00045446, // n0x1407 c0x0000 (---------------) + gotdns 0x0003970a, // n0x1408 c0x0000 (---------------) + hobby-site 0x000465c7, // n0x1409 c0x0000 (---------------) + homedns 0x00011207, // n0x140a c0x0000 (---------------) + homeftp 0x00089109, // n0x140b c0x0000 (---------------) + homelinux 0x000896c8, // n0x140c c0x0000 (---------------) + homeunix 0x0003bfce, // n0x140d c0x0000 (---------------) + is-a-bruinsfan 0x0007ce0e, // n0x140e c0x0000 (---------------) + is-a-candidate 0x000a28cf, // n0x140f c0x0000 (---------------) + is-a-celticsfan 0x00105049, // n0x1410 c0x0000 (---------------) + is-a-chef 0x0005a6c9, // n0x1411 c0x0000 (---------------) + is-a-geek 0x0006f9cb, // n0x1412 c0x0000 (---------------) + is-a-knight 0x0008d2cf, // n0x1413 c0x0000 (---------------) + is-a-linux-user 0x00095f0c, // n0x1414 c0x0000 (---------------) + is-a-patsfan 0x000a44cb, // n0x1415 c0x0000 (---------------) + is-a-soxfan 0x000d0048, // n0x1416 c0x0000 (---------------) + is-found 0x000e1747, // n0x1417 c0x0000 (---------------) + is-lost 0x000f2488, // n0x1418 c0x0000 (---------------) + is-saved 0x00107e4b, // n0x1419 c0x0000 (---------------) + is-very-bad 0x0010e84c, // n0x141a c0x0000 (---------------) + is-very-evil 0x0011034c, // n0x141b c0x0000 (---------------) + is-very-good 0x0011df4c, // n0x141c c0x0000 (---------------) + is-very-nice 0x00126a4d, // n0x141d c0x0000 (---------------) + is-very-sweet 0x00043088, // n0x141e c0x0000 (---------------) + isa-geek 0x000a0209, // n0x141f c0x0000 (---------------) + kicks-ass 0x000c0a4b, // n0x1420 c0x0000 (---------------) + misconfused 0x000c2e47, // n0x1421 c0x0000 (---------------) + podzone 0x000bc44a, // n0x1422 c0x0000 (---------------) + readmyblog 0x00108ec6, // n0x1423 c0x0000 (---------------) + selfip 0x0012c50d, // n0x1424 c0x0000 (---------------) + sellsyourhome 0x000c10c8, // n0x1425 c0x0000 (---------------) + servebbs 0x000c1288, // n0x1426 c0x0000 (---------------) + serveftp 0x000db249, // n0x1427 c0x0000 (---------------) + servegame 0x000ddfcc, // n0x1428 c0x0000 (---------------) + stuff-4-sale 0x00002342, // n0x1429 c0x0000 (---------------) + us 0x00017306, // n0x142a c0x0000 (---------------) + webhop 0x00002702, // n0x142b c0x0000 (---------------) + za 0x000053c2, // n0x142c c0x0000 (---------------) + go 0x00011204, // n0x142d c0x0000 (---------------) + home 0x00210d03, // n0x142e c0x0000 (---------------) + I abo 0x002028c2, // n0x142f c0x0000 (---------------) + I ac 0x002104c3, // n0x1430 c0x0000 (---------------) + I com 0x002ceec3, // n0x1431 c0x0000 (---------------) + I edu 0x00230083, // n0x1432 c0x0000 (---------------) + I gob 0x00200243, // n0x1433 c0x0000 (---------------) + I ing 0x002382c3, // n0x1434 c0x0000 (---------------) + I med 0x00239bc3, // n0x1435 c0x0000 (---------------) + I net 0x002006c3, // n0x1436 c0x0000 (---------------) + I nom 0x002453c3, // n0x1437 c0x0000 (---------------) + I org 0x002c7b43, // n0x1438 c0x0000 (---------------) + I sld 0x002104c3, // n0x1439 c0x0000 (---------------) + I com 0x002ceec3, // n0x143a c0x0000 (---------------) + I edu 0x00230083, // n0x143b c0x0000 (---------------) + I gob 0x0025f683, // n0x143c c0x0000 (---------------) + I mil 0x00239bc3, // n0x143d c0x0000 (---------------) + I net 0x002006c3, // n0x143e c0x0000 (---------------) + I nom 0x002453c3, // n0x143f c0x0000 (---------------) + I org 0x002104c3, // n0x1440 c0x0000 (---------------) + I com 0x002ceec3, // n0x1441 c0x0000 (---------------) + I edu 0x002453c3, // n0x1442 c0x0000 (---------------) + I org 0x002104c3, // n0x1443 c0x0000 (---------------) + I com 0x002ceec3, // n0x1444 c0x0000 (---------------) + I edu 0x002150c3, // n0x1445 c0x0000 (---------------) + I gov 0x00200041, // n0x1446 c0x0000 (---------------) + I i 0x0025f683, // n0x1447 c0x0000 (---------------) + I mil 0x00239bc3, // n0x1448 c0x0000 (---------------) + I net 0x00206ac3, // n0x1449 c0x0000 (---------------) + I ngo 0x002453c3, // n0x144a c0x0000 (---------------) + I org 0x002b5183, // n0x144b c0x0000 (---------------) + I biz 0x002104c3, // n0x144c c0x0000 (---------------) + I com 0x002ceec3, // n0x144d c0x0000 (---------------) + I edu 0x00249243, // n0x144e c0x0000 (---------------) + I fam 0x00230083, // n0x144f c0x0000 (---------------) + I gob 0x00319c03, // n0x1450 c0x0000 (---------------) + I gok 0x0026c703, // n0x1451 c0x0000 (---------------) + I gon 0x00287a03, // n0x1452 c0x0000 (---------------) + I gop 0x0021ee83, // n0x1453 c0x0000 (---------------) + I gos 0x002150c3, // n0x1454 c0x0000 (---------------) + I gov 0x002180c4, // n0x1455 c0x0000 (---------------) + I info 0x00239bc3, // n0x1456 c0x0000 (---------------) + I net 0x002453c3, // n0x1457 c0x0000 (---------------) + I org 0x00209243, // n0x1458 c0x0000 (---------------) + I web 0x0025f2c5, // n0x1459 c0x0000 (---------------) + I 6bone 0x002fc084, // n0x145a c0x0000 (---------------) + I agro 0x00253803, // n0x145b c0x0000 (---------------) + I aid 0x0020c703, // n0x145c c0x0000 (---------------) + I art 0x0023d4c3, // n0x145d c0x0000 (---------------) + I atm 0x002d2b48, // n0x145e c0x0000 (---------------) + I augustow 0x002eb244, // n0x145f c0x0000 (---------------) + I auto 0x00279d0a, // n0x1460 c0x0000 (---------------) + I babia-gora 0x00298d06, // n0x1461 c0x0000 (---------------) + I bedzin 0x00349447, // n0x1462 c0x0000 (---------------) + I beskidy 0x0021d68a, // n0x1463 c0x0000 (---------------) + I bialowieza 0x002908c9, // n0x1464 c0x0000 (---------------) + I bialystok 0x00200007, // n0x1465 c0x0000 (---------------) + I bielawa 0x0020258a, // n0x1466 c0x0000 (---------------) + I bieszczady 0x002b5183, // n0x1467 c0x0000 (---------------) + I biz 0x002d220b, // n0x1468 c0x0000 (---------------) + I boleslawiec 0x002cb209, // n0x1469 c0x0000 (---------------) + I bydgoszcz 0x00255345, // n0x146a c0x0000 (---------------) + I bytom 0x002b4387, // n0x146b c0x0000 (---------------) + I cieszyn 0x00008f82, // n0x146c c0x0000 (---------------) + co 0x002104c3, // n0x146d c0x0000 (---------------) + I com 0x00339387, // n0x146e c0x0000 (---------------) + I czeladz 0x002167c5, // n0x146f c0x0000 (---------------) + I czest 0x002a6549, // n0x1470 c0x0000 (---------------) + I dlugoleka 0x002ceec3, // n0x1471 c0x0000 (---------------) + I edu 0x00220fc6, // n0x1472 c0x0000 (---------------) + I elblag 0x002d97c3, // n0x1473 c0x0000 (---------------) + I elk 0x002d3303, // n0x1474 c0x0000 (---------------) + I gda 0x002e5a06, // n0x1475 c0x0000 (---------------) + I gdansk 0x002fbf46, // n0x1476 c0x0000 (---------------) + I gdynia 0x0027ff87, // n0x1477 c0x0000 (---------------) + I gliwice 0x0031ce46, // n0x1478 c0x0000 (---------------) + I glogow 0x00229b45, // n0x1479 c0x0000 (---------------) + I gmina 0x003456c7, // n0x147a c0x0000 (---------------) + I gniezno 0x0029f387, // n0x147b c0x0000 (---------------) + I gorlice 0x3fe150c3, // n0x147c c0x00ff (n0x1504-n0x150d) + I gov 0x002f1747, // n0x147d c0x0000 (---------------) + I grajewo 0x00288843, // n0x147e c0x0000 (---------------) + I gsm 0x002fc4c5, // n0x147f c0x0000 (---------------) + I ilawa 0x002180c4, // n0x1480 c0x0000 (---------------) + I info 0x00261b03, // n0x1481 c0x0000 (---------------) + I irc 0x0029f708, // n0x1482 c0x0000 (---------------) + I jaworzno 0x0025244c, // n0x1483 c0x0000 (---------------) + I jelenia-gora 0x0028ff45, // n0x1484 c0x0000 (---------------) + I jgora 0x0029c306, // n0x1485 c0x0000 (---------------) + I kalisz 0x00339247, // n0x1486 c0x0000 (---------------) + I karpacz 0x003504c7, // n0x1487 c0x0000 (---------------) + I kartuzy 0x00255207, // n0x1488 c0x0000 (---------------) + I kaszuby 0x00264388, // n0x1489 c0x0000 (---------------) + I katowice 0x0022bccf, // n0x148a c0x0000 (---------------) + I kazimierz-dolny 0x002ed945, // n0x148b c0x0000 (---------------) + I kepno 0x002344c7, // n0x148c c0x0000 (---------------) + I ketrzyn 0x002b2907, // n0x148d c0x0000 (---------------) + I klodzko 0x00288e8a, // n0x148e c0x0000 (---------------) + I kobierzyce 0x00299f49, // n0x148f c0x0000 (---------------) + I kolobrzeg 0x002e5b45, // n0x1490 c0x0000 (---------------) + I konin 0x002e6c8a, // n0x1491 c0x0000 (---------------) + I konskowola 0x00299b46, // n0x1492 c0x0000 (---------------) + I krakow 0x002a3745, // n0x1493 c0x0000 (---------------) + I kutno 0x002b9104, // n0x1494 c0x0000 (---------------) + I lapy 0x0022b9c6, // n0x1495 c0x0000 (---------------) + I lebork 0x0021b647, // n0x1496 c0x0000 (---------------) + I legnica 0x002edb87, // n0x1497 c0x0000 (---------------) + I lezajsk 0x002ec208, // n0x1498 c0x0000 (---------------) + I limanowa 0x003537c5, // n0x1499 c0x0000 (---------------) + I lomza 0x002166c6, // n0x149a c0x0000 (---------------) + I lowicz 0x00259d05, // n0x149b c0x0000 (---------------) + I lubin 0x0031d145, // n0x149c c0x0000 (---------------) + I lukow 0x00216604, // n0x149d c0x0000 (---------------) + I mail 0x00222987, // n0x149e c0x0000 (---------------) + I malbork 0x0028e18a, // n0x149f c0x0000 (---------------) + I malopolska 0x0021c188, // n0x14a0 c0x0000 (---------------) + I mazowsze 0x002e5786, // n0x14a1 c0x0000 (---------------) + I mazury 0x002fd0c5, // n0x14a2 c0x0000 (---------------) + I mbone 0x002382c3, // n0x14a3 c0x0000 (---------------) + I med 0x002e2905, // n0x14a4 c0x0000 (---------------) + I media 0x002d8e86, // n0x14a5 c0x0000 (---------------) + I miasta 0x00201806, // n0x14a6 c0x0000 (---------------) + I mielec 0x00292086, // n0x14a7 c0x0000 (---------------) + I mielno 0x0025f683, // n0x14a8 c0x0000 (---------------) + I mil 0x00333987, // n0x14a9 c0x0000 (---------------) + I mragowo 0x002b2885, // n0x14aa c0x0000 (---------------) + I naklo 0x00239bc3, // n0x14ab c0x0000 (---------------) + I net 0x00206ac3, // n0x14ac c0x0000 (---------------) + I ngo 0x0033e78d, // n0x14ad c0x0000 (---------------) + I nieruchomosci 0x002006c3, // n0x14ae c0x0000 (---------------) + I nom 0x002ec308, // n0x14af c0x0000 (---------------) + I nowaruda 0x00319e44, // n0x14b0 c0x0000 (---------------) + I nysa 0x00262bc5, // n0x14b1 c0x0000 (---------------) + I olawa 0x00288d86, // n0x14b2 c0x0000 (---------------) + I olecko 0x002dab06, // n0x14b3 c0x0000 (---------------) + I olkusz 0x0020eec7, // n0x14b4 c0x0000 (---------------) + I olsztyn 0x00217407, // n0x14b5 c0x0000 (---------------) + I opoczno 0x0034b5c5, // n0x14b6 c0x0000 (---------------) + I opole 0x002453c3, // n0x14b7 c0x0000 (---------------) + I org 0x002a3107, // n0x14b8 c0x0000 (---------------) + I ostroda 0x0031fd89, // n0x14b9 c0x0000 (---------------) + I ostroleka 0x00338309, // n0x14ba c0x0000 (---------------) + I ostrowiec 0x002268ca, // n0x14bb c0x0000 (---------------) + I ostrowwlkp 0x002cea02, // n0x14bc c0x0000 (---------------) + I pc 0x002fc484, // n0x14bd c0x0000 (---------------) + I pila 0x002bec84, // n0x14be c0x0000 (---------------) + I pisz 0x002c2707, // n0x14bf c0x0000 (---------------) + I podhale 0x002c2b48, // n0x14c0 c0x0000 (---------------) + I podlasie 0x0024a249, // n0x14c1 c0x0000 (---------------) + I polkowice 0x0021d989, // n0x14c2 c0x0000 (---------------) + I pomorskie 0x002c3647, // n0x14c3 c0x0000 (---------------) + I pomorze 0x00207a86, // n0x14c4 c0x0000 (---------------) + I powiat 0x002c4306, // n0x14c5 c0x0000 (---------------) + I poznan 0x002c5804, // n0x14c6 c0x0000 (---------------) + I priv 0x002c598a, // n0x14c7 c0x0000 (---------------) + I prochowice 0x002c6c88, // n0x14c8 c0x0000 (---------------) + I pruszkow 0x002c6e89, // n0x14c9 c0x0000 (---------------) + I przeworsk 0x00309e06, // n0x14ca c0x0000 (---------------) + I pulawy 0x00295845, // n0x14cb c0x0000 (---------------) + I radom 0x0021c048, // n0x14cc c0x0000 (---------------) + I rawa-maz 0x002ad8ca, // n0x14cd c0x0000 (---------------) + I realestate 0x00202143, // n0x14ce c0x0000 (---------------) + I rel 0x002a9646, // n0x14cf c0x0000 (---------------) + I rybnik 0x002c3747, // n0x14d0 c0x0000 (---------------) + I rzeszow 0x00276005, // n0x14d1 c0x0000 (---------------) + I sanok 0x00319d05, // n0x14d2 c0x0000 (---------------) + I sejny 0x0020e3c3, // n0x14d3 c0x0000 (---------------) + I sex 0x00227ec4, // n0x14d4 c0x0000 (---------------) + I shop 0x002c2c87, // n0x14d5 c0x0000 (---------------) + I siedlce 0x00222dc5, // n0x14d6 c0x0000 (---------------) + I sklep 0x00268b47, // n0x14d7 c0x0000 (---------------) + I skoczow 0x0025ab85, // n0x14d8 c0x0000 (---------------) + I slask 0x002d3e46, // n0x14d9 c0x0000 (---------------) + I slupsk 0x002d4d85, // n0x14da c0x0000 (---------------) + I sopot 0x0023a843, // n0x14db c0x0000 (---------------) + I sos 0x0025cfc9, // n0x14dc c0x0000 (---------------) + I sosnowiec 0x0026298c, // n0x14dd c0x0000 (---------------) + I stalowa-wola 0x002a0e4c, // n0x14de c0x0000 (---------------) + I starachowice 0x0025ed08, // n0x14df c0x0000 (---------------) + I stargard 0x002c8107, // n0x14e0 c0x0000 (---------------) + I suwalki 0x002e0108, // n0x14e1 c0x0000 (---------------) + I swidnica 0x002e068a, // n0x14e2 c0x0000 (---------------) + I swiebodzin 0x002e0a4b, // n0x14e3 c0x0000 (---------------) + I swinoujscie 0x002cb348, // n0x14e4 c0x0000 (---------------) + I szczecin 0x002ecb88, // n0x14e5 c0x0000 (---------------) + I szczytno 0x0029c406, // n0x14e6 c0x0000 (---------------) + I szkola 0x0027c605, // n0x14e7 c0x0000 (---------------) + I targi 0x0031c1ca, // n0x14e8 c0x0000 (---------------) + I tarnobrzeg 0x0023c885, // n0x14e9 c0x0000 (---------------) + I tgory 0x0023d502, // n0x14ea c0x0000 (---------------) + I tm 0x002aae07, // n0x14eb c0x0000 (---------------) + I tourism 0x0029ed06, // n0x14ec c0x0000 (---------------) + I travel 0x00206545, // n0x14ed c0x0000 (---------------) + I turek 0x002e54c9, // n0x14ee c0x0000 (---------------) + I turystyka 0x00319fc5, // n0x14ef c0x0000 (---------------) + I tychy 0x00277886, // n0x14f0 c0x0000 (---------------) + I usenet 0x002947c5, // n0x14f1 c0x0000 (---------------) + I ustka 0x002b5c89, // n0x14f2 c0x0000 (---------------) + I walbrzych 0x00228906, // n0x14f3 c0x0000 (---------------) + I warmia 0x0024c188, // n0x14f4 c0x0000 (---------------) + I warszawa 0x002a1e43, // n0x14f5 c0x0000 (---------------) + I waw 0x002255c6, // n0x14f6 c0x0000 (---------------) + I wegrow 0x0025ca46, // n0x14f7 c0x0000 (---------------) + I wielun 0x0031d245, // n0x14f8 c0x0000 (---------------) + I wlocl 0x0031d249, // n0x14f9 c0x0000 (---------------) + I wloclawek 0x002601c9, // n0x14fa c0x0000 (---------------) + I wodzislaw 0x002f1887, // n0x14fb c0x0000 (---------------) + I wolomin 0x0023b304, // n0x14fc c0x0000 (---------------) + I wroc 0x0023b307, // n0x14fd c0x0000 (---------------) + I wroclaw 0x0021d889, // n0x14fe c0x0000 (---------------) + I zachpomor 0x00237c45, // n0x14ff c0x0000 (---------------) + I zagan 0x002500c8, // n0x1500 c0x0000 (---------------) + I zakopane 0x0022d4c5, // n0x1501 c0x0000 (---------------) + I zarow 0x00225d85, // n0x1502 c0x0000 (---------------) + I zgora 0x00239c89, // n0x1503 c0x0000 (---------------) + I zgorzelec 0x00211382, // n0x1504 c0x0000 (---------------) + I pa 0x00202e82, // n0x1505 c0x0000 (---------------) + I po 0x00202fc2, // n0x1506 c0x0000 (---------------) + I so 0x002b1502, // n0x1507 c0x0000 (---------------) + I sr 0x00260009, // n0x1508 c0x0000 (---------------) + I starostwo 0x00200882, // n0x1509 c0x0000 (---------------) + I ug 0x00205d82, // n0x150a c0x0000 (---------------) + I um 0x00207a44, // n0x150b c0x0000 (---------------) + I upow 0x002394c2, // n0x150c c0x0000 (---------------) + I uw 0x00208f82, // n0x150d c0x0000 (---------------) + I co 0x002ceec3, // n0x150e c0x0000 (---------------) + I edu 0x002150c3, // n0x150f c0x0000 (---------------) + I gov 0x00239bc3, // n0x1510 c0x0000 (---------------) + I net 0x002453c3, // n0x1511 c0x0000 (---------------) + I org 0x002028c2, // n0x1512 c0x0000 (---------------) + I ac 0x002b5183, // n0x1513 c0x0000 (---------------) + I biz 0x002104c3, // n0x1514 c0x0000 (---------------) + I com 0x002ceec3, // n0x1515 c0x0000 (---------------) + I edu 0x00202443, // n0x1516 c0x0000 (---------------) + I est 0x002150c3, // n0x1517 c0x0000 (---------------) + I gov 0x002180c4, // n0x1518 c0x0000 (---------------) + I info 0x002602c4, // n0x1519 c0x0000 (---------------) + I isla 0x002d16c4, // n0x151a c0x0000 (---------------) + I name 0x00239bc3, // n0x151b c0x0000 (---------------) + I net 0x002453c3, // n0x151c c0x0000 (---------------) + I org 0x002c5983, // n0x151d c0x0000 (---------------) + I pro 0x002c5e84, // n0x151e c0x0000 (---------------) + I prof 0x00271e83, // n0x151f c0x0000 (---------------) + I aca 0x00234383, // n0x1520 c0x0000 (---------------) + I bar 0x0022ccc3, // n0x1521 c0x0000 (---------------) + I cpa 0x0020bac3, // n0x1522 c0x0000 (---------------) + I eng 0x0025ba03, // n0x1523 c0x0000 (---------------) + I jur 0x002000c3, // n0x1524 c0x0000 (---------------) + I law 0x002382c3, // n0x1525 c0x0000 (---------------) + I med 0x002104c3, // n0x1526 c0x0000 (---------------) + I com 0x002ceec3, // n0x1527 c0x0000 (---------------) + I edu 0x002150c3, // n0x1528 c0x0000 (---------------) + I gov 0x00239bc3, // n0x1529 c0x0000 (---------------) + I net 0x002453c3, // n0x152a c0x0000 (---------------) + I org 0x002c2283, // n0x152b c0x0000 (---------------) + I plo 0x002ea0c3, // n0x152c c0x0000 (---------------) + I sec 0x00031c88, // n0x152d c0x0000 (---------------) + blogspot 0x002104c3, // n0x152e c0x0000 (---------------) + I com 0x002ceec3, // n0x152f c0x0000 (---------------) + I edu 0x002150c3, // n0x1530 c0x0000 (---------------) + I gov 0x0021fe43, // n0x1531 c0x0000 (---------------) + I int 0x00239bc3, // n0x1532 c0x0000 (---------------) + I net 0x00244944, // n0x1533 c0x0000 (---------------) + I nome 0x002453c3, // n0x1534 c0x0000 (---------------) + I org 0x0029d704, // n0x1535 c0x0000 (---------------) + I publ 0x002d2a85, // n0x1536 c0x0000 (---------------) + I belau 0x00208f82, // n0x1537 c0x0000 (---------------) + I co 0x00203582, // n0x1538 c0x0000 (---------------) + I ed 0x002053c2, // n0x1539 c0x0000 (---------------) + I go 0x00205f42, // n0x153a c0x0000 (---------------) + I ne 0x00204282, // n0x153b c0x0000 (---------------) + I or 0x002104c3, // n0x153c c0x0000 (---------------) + I com 0x00236044, // n0x153d c0x0000 (---------------) + I coop 0x002ceec3, // n0x153e c0x0000 (---------------) + I edu 0x002150c3, // n0x153f c0x0000 (---------------) + I gov 0x0025f683, // n0x1540 c0x0000 (---------------) + I mil 0x00239bc3, // n0x1541 c0x0000 (---------------) + I net 0x002453c3, // n0x1542 c0x0000 (---------------) + I org 0x002104c3, // n0x1543 c0x0000 (---------------) + I com 0x002ceec3, // n0x1544 c0x0000 (---------------) + I edu 0x002150c3, // n0x1545 c0x0000 (---------------) + I gov 0x0025f683, // n0x1546 c0x0000 (---------------) + I mil 0x002d16c4, // n0x1547 c0x0000 (---------------) + I name 0x00239bc3, // n0x1548 c0x0000 (---------------) + I net 0x002453c3, // n0x1549 c0x0000 (---------------) + I org 0x00204343, // n0x154a c0x0000 (---------------) + I sch 0x00202f44, // n0x154b c0x0000 (---------------) + I asso 0x00031c88, // n0x154c c0x0000 (---------------) + blogspot 0x002104c3, // n0x154d c0x0000 (---------------) + I com 0x002006c3, // n0x154e c0x0000 (---------------) + I nom 0x0023fec4, // n0x154f c0x0000 (---------------) + I arts 0x00031c88, // n0x1550 c0x0000 (---------------) + blogspot 0x002104c3, // n0x1551 c0x0000 (---------------) + I com 0x00240684, // n0x1552 c0x0000 (---------------) + I firm 0x002180c4, // n0x1553 c0x0000 (---------------) + I info 0x002006c3, // n0x1554 c0x0000 (---------------) + I nom 0x00204e02, // n0x1555 c0x0000 (---------------) + I nt 0x002453c3, // n0x1556 c0x0000 (---------------) + I org 0x002a8343, // n0x1557 c0x0000 (---------------) + I rec 0x002dd805, // n0x1558 c0x0000 (---------------) + I store 0x0023d502, // n0x1559 c0x0000 (---------------) + I tm 0x0023b483, // n0x155a c0x0000 (---------------) + I www 0x002028c2, // n0x155b c0x0000 (---------------) + I ac 0x00208f82, // n0x155c c0x0000 (---------------) + I co 0x002ceec3, // n0x155d c0x0000 (---------------) + I edu 0x002150c3, // n0x155e c0x0000 (---------------) + I gov 0x00200242, // n0x155f c0x0000 (---------------) + I in 0x002453c3, // n0x1560 c0x0000 (---------------) + I org 0x002028c2, // n0x1561 c0x0000 (---------------) + I ac 0x00202747, // n0x1562 c0x0000 (---------------) + I adygeya 0x002dea45, // n0x1563 c0x0000 (---------------) + I altai 0x0026f6c4, // n0x1564 c0x0000 (---------------) + I amur 0x002c64c6, // n0x1565 c0x0000 (---------------) + I amursk 0x002f8c8b, // n0x1566 c0x0000 (---------------) + I arkhangelsk 0x00247349, // n0x1567 c0x0000 (---------------) + I astrakhan 0x0029c246, // n0x1568 c0x0000 (---------------) + I baikal 0x00328cc9, // n0x1569 c0x0000 (---------------) + I bashkiria 0x0029e788, // n0x156a c0x0000 (---------------) + I belgorod 0x0020c603, // n0x156b c0x0000 (---------------) + I bir 0x00222c87, // n0x156c c0x0000 (---------------) + I bryansk 0x0024fb08, // n0x156d c0x0000 (---------------) + I buryatia 0x0033c783, // n0x156e c0x0000 (---------------) + I cbg 0x00258dc4, // n0x156f c0x0000 (---------------) + I chel 0x0025d1cb, // n0x1570 c0x0000 (---------------) + I chelyabinsk 0x002a1ac5, // n0x1571 c0x0000 (---------------) + I chita 0x0032e208, // n0x1572 c0x0000 (---------------) + I chukotka 0x003317c9, // n0x1573 c0x0000 (---------------) + I chuvashia 0x00345f83, // n0x1574 c0x0000 (---------------) + I cmw 0x002104c3, // n0x1575 c0x0000 (---------------) + I com 0x002d2d88, // n0x1576 c0x0000 (---------------) + I dagestan 0x00263247, // n0x1577 c0x0000 (---------------) + I dudinka 0x0025fd06, // n0x1578 c0x0000 (---------------) + I e-burg 0x002ceec3, // n0x1579 c0x0000 (---------------) + I edu 0x003168c7, // n0x157a c0x0000 (---------------) + I fareast 0x002150c3, // n0x157b c0x0000 (---------------) + I gov 0x002421c6, // n0x157c c0x0000 (---------------) + I grozny 0x0021fe43, // n0x157d c0x0000 (---------------) + I int 0x00271547, // n0x157e c0x0000 (---------------) + I irkutsk 0x0027fa87, // n0x157f c0x0000 (---------------) + I ivanovo 0x0031e947, // n0x1580 c0x0000 (---------------) + I izhevsk 0x00222905, // n0x1581 c0x0000 (---------------) + I jamal 0x0020eb83, // n0x1582 c0x0000 (---------------) + I jar 0x0023ee4b, // n0x1583 c0x0000 (---------------) + I joshkar-ola 0x002edd08, // n0x1584 c0x0000 (---------------) + I k-uralsk 0x002a8bc8, // n0x1585 c0x0000 (---------------) + I kalmykia 0x002a6706, // n0x1586 c0x0000 (---------------) + I kaluga 0x002c9549, // n0x1587 c0x0000 (---------------) + I kamchatka 0x00224c87, // n0x1588 c0x0000 (---------------) + I karelia 0x002e3b05, // n0x1589 c0x0000 (---------------) + I kazan 0x00333204, // n0x158a c0x0000 (---------------) + I kchr 0x0022e588, // n0x158b c0x0000 (---------------) + I kemerovo 0x00244dca, // n0x158c c0x0000 (---------------) + I khabarovsk 0x00245009, // n0x158d c0x0000 (---------------) + I khakassia 0x002f5cc3, // n0x158e c0x0000 (---------------) + I khv 0x00264e05, // n0x158f c0x0000 (---------------) + I kirov 0x0031e783, // n0x1590 c0x0000 (---------------) + I kms 0x002ce586, // n0x1591 c0x0000 (---------------) + I koenig 0x002b82c4, // n0x1592 c0x0000 (---------------) + I komi 0x002951c8, // n0x1593 c0x0000 (---------------) + I kostroma 0x00299ccb, // n0x1594 c0x0000 (---------------) + I krasnoyarsk 0x0026d545, // n0x1595 c0x0000 (---------------) + I kuban 0x0029e506, // n0x1596 c0x0000 (---------------) + I kurgan 0x002a1145, // n0x1597 c0x0000 (---------------) + I kursk 0x002a1708, // n0x1598 c0x0000 (---------------) + I kustanai 0x002a3887, // n0x1599 c0x0000 (---------------) + I kuzbass 0x00349c87, // n0x159a c0x0000 (---------------) + I lipetsk 0x002912c7, // n0x159b c0x0000 (---------------) + I magadan 0x0030f748, // n0x159c c0x0000 (---------------) + I magnitka 0x0021cb84, // n0x159d c0x0000 (---------------) + I mari 0x0021cb87, // n0x159e c0x0000 (---------------) + I mari-el 0x00325746, // n0x159f c0x0000 (---------------) + I marine 0x0025f683, // n0x15a0 c0x0000 (---------------) + I mil 0x002af048, // n0x15a1 c0x0000 (---------------) + I mordovia 0x002b1486, // n0x15a2 c0x0000 (---------------) + I mosreg 0x0022c643, // n0x15a3 c0x0000 (---------------) + I msk 0x002b4748, // n0x15a4 c0x0000 (---------------) + I murmansk 0x002ba0c5, // n0x15a5 c0x0000 (---------------) + I mytis 0x002d4948, // n0x15a6 c0x0000 (---------------) + I nakhodka 0x00319a07, // n0x15a7 c0x0000 (---------------) + I nalchik 0x00239bc3, // n0x15a8 c0x0000 (---------------) + I net 0x002bea03, // n0x15a9 c0x0000 (---------------) + I nkz 0x00270d84, // n0x15aa c0x0000 (---------------) + I nnov 0x00217547, // n0x15ab c0x0000 (---------------) + I norilsk 0x00212f43, // n0x15ac c0x0000 (---------------) + I nov 0x0027fb4b, // n0x15ad c0x0000 (---------------) + I novosibirsk 0x00215c83, // n0x15ae c0x0000 (---------------) + I nsk 0x0022c604, // n0x15af c0x0000 (---------------) + I omsk 0x002dd888, // n0x15b0 c0x0000 (---------------) + I orenburg 0x002453c3, // n0x15b1 c0x0000 (---------------) + I org 0x00290185, // n0x15b2 c0x0000 (---------------) + I oryol 0x0021b545, // n0x15b3 c0x0000 (---------------) + I oskol 0x002b6106, // n0x15b4 c0x0000 (---------------) + I palana 0x002278c5, // n0x15b5 c0x0000 (---------------) + I penza 0x002ba484, // n0x15b6 c0x0000 (---------------) + I perm 0x00208642, // n0x15b7 c0x0000 (---------------) + I pp 0x002d3f05, // n0x15b8 c0x0000 (---------------) + I pskov 0x002c7143, // n0x15b9 c0x0000 (---------------) + I ptz 0x002b918a, // n0x15ba c0x0000 (---------------) + I pyatigorsk 0x0021b103, // n0x15bb c0x0000 (---------------) + I rnd 0x00279609, // n0x15bc c0x0000 (---------------) + I rubtsovsk 0x0021c886, // n0x15bd c0x0000 (---------------) + I ryazan 0x00264148, // n0x15be c0x0000 (---------------) + I sakhalin 0x002735c6, // n0x15bf c0x0000 (---------------) + I samara 0x002614c7, // n0x15c0 c0x0000 (---------------) + I saratov 0x002d3408, // n0x15c1 c0x0000 (---------------) + I simbirsk 0x00215b48, // n0x15c2 c0x0000 (---------------) + I smolensk 0x002d4203, // n0x15c3 c0x0000 (---------------) + I snz 0x002d8503, // n0x15c4 c0x0000 (---------------) + I spb 0x0024a0c9, // n0x15c5 c0x0000 (---------------) + I stavropol 0x002e1a83, // n0x15c6 c0x0000 (---------------) + I stv 0x002ac046, // n0x15c7 c0x0000 (---------------) + I surgut 0x0033f3c6, // n0x15c8 c0x0000 (---------------) + I syzran 0x00207bc6, // n0x15c9 c0x0000 (---------------) + I tambov 0x0022f689, // n0x15ca c0x0000 (---------------) + I tatarstan 0x00231ac4, // n0x15cb c0x0000 (---------------) + I test 0x0020ac83, // n0x15cc c0x0000 (---------------) + I tom 0x002b81c5, // n0x15cd c0x0000 (---------------) + I tomsk 0x002fb449, // n0x15ce c0x0000 (---------------) + I tsaritsyn 0x0022bc43, // n0x15cf c0x0000 (---------------) + I tsk 0x002e36c4, // n0x15d0 c0x0000 (---------------) + I tula 0x002f4e84, // n0x15d1 c0x0000 (---------------) + I tuva 0x00337b84, // n0x15d2 c0x0000 (---------------) + I tver 0x00208146, // n0x15d3 c0x0000 (---------------) + I tyumen 0x002fc9c3, // n0x15d4 c0x0000 (---------------) + I udm 0x002fc9c8, // n0x15d5 c0x0000 (---------------) + I udmurtia 0x00246f88, // n0x15d6 c0x0000 (---------------) + I ulan-ude 0x00257706, // n0x15d7 c0x0000 (---------------) + I vdonsk 0x002e390b, // n0x15d8 c0x0000 (---------------) + I vladikavkaz 0x002e3c48, // n0x15d9 c0x0000 (---------------) + I vladimir 0x002e414b, // n0x15da c0x0000 (---------------) + I vladivostok 0x002e4e09, // n0x15db c0x0000 (---------------) + I volgograd 0x002e5907, // n0x15dc c0x0000 (---------------) + I vologda 0x002e62c8, // n0x15dd c0x0000 (---------------) + I voronezh 0x002e6903, // n0x15de c0x0000 (---------------) + I vrn 0x002e69c6, // n0x15df c0x0000 (---------------) + I vyatka 0x002eb0c7, // n0x15e0 c0x0000 (---------------) + I yakutia 0x0027eb45, // n0x15e1 c0x0000 (---------------) + I yamal 0x002f0849, // n0x15e2 c0x0000 (---------------) + I yaroslavl 0x002fbc4d, // n0x15e3 c0x0000 (---------------) + I yekaterinburg 0x00263f91, // n0x15e4 c0x0000 (---------------) + I yuzhno-sakhalinsk 0x0024b685, // n0x15e5 c0x0000 (---------------) + I zgrad 0x002028c2, // n0x15e6 c0x0000 (---------------) + I ac 0x00208f82, // n0x15e7 c0x0000 (---------------) + I co 0x002104c3, // n0x15e8 c0x0000 (---------------) + I com 0x002ceec3, // n0x15e9 c0x0000 (---------------) + I edu 0x0022fa44, // n0x15ea c0x0000 (---------------) + I gouv 0x002150c3, // n0x15eb c0x0000 (---------------) + I gov 0x0021fe43, // n0x15ec c0x0000 (---------------) + I int 0x0025f683, // n0x15ed c0x0000 (---------------) + I mil 0x00239bc3, // n0x15ee c0x0000 (---------------) + I net 0x002104c3, // n0x15ef c0x0000 (---------------) + I com 0x002ceec3, // n0x15f0 c0x0000 (---------------) + I edu 0x002150c3, // n0x15f1 c0x0000 (---------------) + I gov 0x002382c3, // n0x15f2 c0x0000 (---------------) + I med 0x00239bc3, // n0x15f3 c0x0000 (---------------) + I net 0x002453c3, // n0x15f4 c0x0000 (---------------) + I org 0x00294403, // n0x15f5 c0x0000 (---------------) + I pub 0x00204343, // n0x15f6 c0x0000 (---------------) + I sch 0x002104c3, // n0x15f7 c0x0000 (---------------) + I com 0x002ceec3, // n0x15f8 c0x0000 (---------------) + I edu 0x002150c3, // n0x15f9 c0x0000 (---------------) + I gov 0x00239bc3, // n0x15fa c0x0000 (---------------) + I net 0x002453c3, // n0x15fb c0x0000 (---------------) + I org 0x002104c3, // n0x15fc c0x0000 (---------------) + I com 0x002ceec3, // n0x15fd c0x0000 (---------------) + I edu 0x002150c3, // n0x15fe c0x0000 (---------------) + I gov 0x00239bc3, // n0x15ff c0x0000 (---------------) + I net 0x002453c3, // n0x1600 c0x0000 (---------------) + I org 0x002104c3, // n0x1601 c0x0000 (---------------) + I com 0x002ceec3, // n0x1602 c0x0000 (---------------) + I edu 0x002150c3, // n0x1603 c0x0000 (---------------) + I gov 0x002180c4, // n0x1604 c0x0000 (---------------) + I info 0x002382c3, // n0x1605 c0x0000 (---------------) + I med 0x00239bc3, // n0x1606 c0x0000 (---------------) + I net 0x002453c3, // n0x1607 c0x0000 (---------------) + I org 0x0027ecc2, // n0x1608 c0x0000 (---------------) + I tv 0x00200101, // n0x1609 c0x0000 (---------------) + I a 0x002028c2, // n0x160a c0x0000 (---------------) + I ac 0x00200001, // n0x160b c0x0000 (---------------) + I b 0x002ee802, // n0x160c c0x0000 (---------------) + I bd 0x00031c88, // n0x160d c0x0000 (---------------) + blogspot 0x002185c5, // n0x160e c0x0000 (---------------) + I brand 0x00200401, // n0x160f c0x0000 (---------------) + I c 0x002003c1, // n0x1610 c0x0000 (---------------) + I d 0x00200081, // n0x1611 c0x0000 (---------------) + I e 0x00201ac1, // n0x1612 c0x0000 (---------------) + I f 0x0023da02, // n0x1613 c0x0000 (---------------) + I fh 0x00333144, // n0x1614 c0x0000 (---------------) + I fhsk 0x0023da03, // n0x1615 c0x0000 (---------------) + I fhv 0x002002c1, // n0x1616 c0x0000 (---------------) + I g 0x00200201, // n0x1617 c0x0000 (---------------) + I h 0x00200041, // n0x1618 c0x0000 (---------------) + I i 0x002007c1, // n0x1619 c0x0000 (---------------) + I k 0x002b4907, // n0x161a c0x0000 (---------------) + I komforb 0x002b93cf, // n0x161b c0x0000 (---------------) + I kommunalforbund 0x002d35c6, // n0x161c c0x0000 (---------------) + I komvux 0x002000c1, // n0x161d c0x0000 (---------------) + I l 0x00288a86, // n0x161e c0x0000 (---------------) + I lanbib 0x00200741, // n0x161f c0x0000 (---------------) + I m 0x00200281, // n0x1620 c0x0000 (---------------) + I n 0x00203d0e, // n0x1621 c0x0000 (---------------) + I naturbruksgymn 0x00200341, // n0x1622 c0x0000 (---------------) + I o 0x002453c3, // n0x1623 c0x0000 (---------------) + I org 0x00202e81, // n0x1624 c0x0000 (---------------) + I p 0x002c7205, // n0x1625 c0x0000 (---------------) + I parti 0x00208642, // n0x1626 c0x0000 (---------------) + I pp 0x0020e2c5, // n0x1627 c0x0000 (---------------) + I press 0x00200501, // n0x1628 c0x0000 (---------------) + I r 0x002001c1, // n0x1629 c0x0000 (---------------) + I s 0x002e2c04, // n0x162a c0x0000 (---------------) + I sshn 0x00200301, // n0x162b c0x0000 (---------------) + I t 0x0023d502, // n0x162c c0x0000 (---------------) + I tm 0x00200881, // n0x162d c0x0000 (---------------) + I u 0x00200141, // n0x162e c0x0000 (---------------) + I w 0x00201381, // n0x162f c0x0000 (---------------) + I x 0x002027c1, // n0x1630 c0x0000 (---------------) + I y 0x002011c1, // n0x1631 c0x0000 (---------------) + I z 0x00031c88, // n0x1632 c0x0000 (---------------) + blogspot 0x002104c3, // n0x1633 c0x0000 (---------------) + I com 0x002ceec3, // n0x1634 c0x0000 (---------------) + I edu 0x002150c3, // n0x1635 c0x0000 (---------------) + I gov 0x00239bc3, // n0x1636 c0x0000 (---------------) + I net 0x002453c3, // n0x1637 c0x0000 (---------------) + I org 0x0020f983, // n0x1638 c0x0000 (---------------) + I per 0x002104c3, // n0x1639 c0x0000 (---------------) + I com 0x002150c3, // n0x163a c0x0000 (---------------) + I gov 0x0025f683, // n0x163b c0x0000 (---------------) + I mil 0x00239bc3, // n0x163c c0x0000 (---------------) + I net 0x002453c3, // n0x163d c0x0000 (---------------) + I org 0x00031c88, // n0x163e c0x0000 (---------------) + blogspot 0x002104c3, // n0x163f c0x0000 (---------------) + I com 0x002ceec3, // n0x1640 c0x0000 (---------------) + I edu 0x002150c3, // n0x1641 c0x0000 (---------------) + I gov 0x00239bc3, // n0x1642 c0x0000 (---------------) + I net 0x002453c3, // n0x1643 c0x0000 (---------------) + I org 0x0020c703, // n0x1644 c0x0000 (---------------) + I art 0x002104c3, // n0x1645 c0x0000 (---------------) + I com 0x002ceec3, // n0x1646 c0x0000 (---------------) + I edu 0x0022fa44, // n0x1647 c0x0000 (---------------) + I gouv 0x002453c3, // n0x1648 c0x0000 (---------------) + I org 0x00297805, // n0x1649 c0x0000 (---------------) + I perso 0x00207f44, // n0x164a c0x0000 (---------------) + I univ 0x002104c3, // n0x164b c0x0000 (---------------) + I com 0x00239bc3, // n0x164c c0x0000 (---------------) + I net 0x002453c3, // n0x164d c0x0000 (---------------) + I org 0x00208f82, // n0x164e c0x0000 (---------------) + I co 0x002104c3, // n0x164f c0x0000 (---------------) + I com 0x002325c9, // n0x1650 c0x0000 (---------------) + I consulado 0x002ceec3, // n0x1651 c0x0000 (---------------) + I edu 0x00225b09, // n0x1652 c0x0000 (---------------) + I embaixada 0x002150c3, // n0x1653 c0x0000 (---------------) + I gov 0x0025f683, // n0x1654 c0x0000 (---------------) + I mil 0x00239bc3, // n0x1655 c0x0000 (---------------) + I net 0x002453c3, // n0x1656 c0x0000 (---------------) + I org 0x002c4988, // n0x1657 c0x0000 (---------------) + I principe 0x00253fc7, // n0x1658 c0x0000 (---------------) + I saotome 0x002dd805, // n0x1659 c0x0000 (---------------) + I store 0x002104c3, // n0x165a c0x0000 (---------------) + I com 0x002ceec3, // n0x165b c0x0000 (---------------) + I edu 0x00230083, // n0x165c c0x0000 (---------------) + I gob 0x002453c3, // n0x165d c0x0000 (---------------) + I org 0x00249483, // n0x165e c0x0000 (---------------) + I red 0x002150c3, // n0x165f c0x0000 (---------------) + I gov 0x002104c3, // n0x1660 c0x0000 (---------------) + I com 0x002ceec3, // n0x1661 c0x0000 (---------------) + I edu 0x002150c3, // n0x1662 c0x0000 (---------------) + I gov 0x0025f683, // n0x1663 c0x0000 (---------------) + I mil 0x00239bc3, // n0x1664 c0x0000 (---------------) + I net 0x002453c3, // n0x1665 c0x0000 (---------------) + I org 0x002028c2, // n0x1666 c0x0000 (---------------) + I ac 0x00208f82, // n0x1667 c0x0000 (---------------) + I co 0x002453c3, // n0x1668 c0x0000 (---------------) + I org 0x00031c88, // n0x1669 c0x0000 (---------------) + blogspot 0x002028c2, // n0x166a c0x0000 (---------------) + I ac 0x00208f82, // n0x166b c0x0000 (---------------) + I co 0x002053c2, // n0x166c c0x0000 (---------------) + I go 0x00200242, // n0x166d c0x0000 (---------------) + I in 0x00200e02, // n0x166e c0x0000 (---------------) + I mi 0x00239bc3, // n0x166f c0x0000 (---------------) + I net 0x00204282, // n0x1670 c0x0000 (---------------) + I or 0x002028c2, // n0x1671 c0x0000 (---------------) + I ac 0x002b5183, // n0x1672 c0x0000 (---------------) + I biz 0x00208f82, // n0x1673 c0x0000 (---------------) + I co 0x002104c3, // n0x1674 c0x0000 (---------------) + I com 0x002ceec3, // n0x1675 c0x0000 (---------------) + I edu 0x002053c2, // n0x1676 c0x0000 (---------------) + I go 0x002150c3, // n0x1677 c0x0000 (---------------) + I gov 0x0021fe43, // n0x1678 c0x0000 (---------------) + I int 0x0025f683, // n0x1679 c0x0000 (---------------) + I mil 0x002d16c4, // n0x167a c0x0000 (---------------) + I name 0x00239bc3, // n0x167b c0x0000 (---------------) + I net 0x002131c3, // n0x167c c0x0000 (---------------) + I nic 0x002453c3, // n0x167d c0x0000 (---------------) + I org 0x00231ac4, // n0x167e c0x0000 (---------------) + I test 0x00209243, // n0x167f c0x0000 (---------------) + I web 0x002150c3, // n0x1680 c0x0000 (---------------) + I gov 0x00208f82, // n0x1681 c0x0000 (---------------) + I co 0x002104c3, // n0x1682 c0x0000 (---------------) + I com 0x002ceec3, // n0x1683 c0x0000 (---------------) + I edu 0x002150c3, // n0x1684 c0x0000 (---------------) + I gov 0x0025f683, // n0x1685 c0x0000 (---------------) + I mil 0x00239bc3, // n0x1686 c0x0000 (---------------) + I net 0x002006c3, // n0x1687 c0x0000 (---------------) + I nom 0x002453c3, // n0x1688 c0x0000 (---------------) + I org 0x002fb907, // n0x1689 c0x0000 (---------------) + I agrinet 0x002104c3, // n0x168a c0x0000 (---------------) + I com 0x0031b907, // n0x168b c0x0000 (---------------) + I defense 0x002e9006, // n0x168c c0x0000 (---------------) + I edunet 0x002084c3, // n0x168d c0x0000 (---------------) + I ens 0x0023fdc3, // n0x168e c0x0000 (---------------) + I fin 0x002150c3, // n0x168f c0x0000 (---------------) + I gov 0x0020ca83, // n0x1690 c0x0000 (---------------) + I ind 0x002180c4, // n0x1691 c0x0000 (---------------) + I info 0x0026e104, // n0x1692 c0x0000 (---------------) + I intl 0x00296c46, // n0x1693 c0x0000 (---------------) + I mincom 0x00201c83, // n0x1694 c0x0000 (---------------) + I nat 0x00239bc3, // n0x1695 c0x0000 (---------------) + I net 0x002453c3, // n0x1696 c0x0000 (---------------) + I org 0x00297805, // n0x1697 c0x0000 (---------------) + I perso 0x00342244, // n0x1698 c0x0000 (---------------) + I rnrt 0x00257ac3, // n0x1699 c0x0000 (---------------) + I rns 0x00272d43, // n0x169a c0x0000 (---------------) + I rnu 0x002aae07, // n0x169b c0x0000 (---------------) + I tourism 0x00240d45, // n0x169c c0x0000 (---------------) + I turen 0x002104c3, // n0x169d c0x0000 (---------------) + I com 0x002ceec3, // n0x169e c0x0000 (---------------) + I edu 0x002150c3, // n0x169f c0x0000 (---------------) + I gov 0x0025f683, // n0x16a0 c0x0000 (---------------) + I mil 0x00239bc3, // n0x16a1 c0x0000 (---------------) + I net 0x002453c3, // n0x16a2 c0x0000 (---------------) + I org 0x49601f42, // n0x16a3 c0x0125 (n0x16a5-n0x16a6) o I nc 0x006131c3, // n0x16a4 c0x0001 (---------------) ! I nic 0x002150c3, // n0x16a5 c0x0000 (---------------) + I gov 0x002251c4, // n0x16a6 c0x0000 (---------------) + I aero 0x002b5183, // n0x16a7 c0x0000 (---------------) + I biz 0x00208f82, // n0x16a8 c0x0000 (---------------) + I co 0x002104c3, // n0x16a9 c0x0000 (---------------) + I com 0x00236044, // n0x16aa c0x0000 (---------------) + I coop 0x002ceec3, // n0x16ab c0x0000 (---------------) + I edu 0x002150c3, // n0x16ac c0x0000 (---------------) + I gov 0x002180c4, // n0x16ad c0x0000 (---------------) + I info 0x0021fe43, // n0x16ae c0x0000 (---------------) + I int 0x00285dc4, // n0x16af c0x0000 (---------------) + I jobs 0x0020adc4, // n0x16b0 c0x0000 (---------------) + I mobi 0x002b9786, // n0x16b1 c0x0000 (---------------) + I museum 0x002d16c4, // n0x16b2 c0x0000 (---------------) + I name 0x00239bc3, // n0x16b3 c0x0000 (---------------) + I net 0x002453c3, // n0x16b4 c0x0000 (---------------) + I org 0x002c5983, // n0x16b5 c0x0000 (---------------) + I pro 0x0029ed06, // n0x16b6 c0x0000 (---------------) + I travel 0x00043b8b, // n0x16b7 c0x0000 (---------------) + better-than 0x00007546, // n0x16b8 c0x0000 (---------------) + dyndns 0x0001714a, // n0x16b9 c0x0000 (---------------) + on-the-web 0x00133aca, // n0x16ba c0x0000 (---------------) + worse-than 0x00031c88, // n0x16bb c0x0000 (---------------) + blogspot 0x00259cc4, // n0x16bc c0x0000 (---------------) + I club 0x002104c3, // n0x16bd c0x0000 (---------------) + I com 0x002b5144, // n0x16be c0x0000 (---------------) + I ebiz 0x002ceec3, // n0x16bf c0x0000 (---------------) + I edu 0x00274604, // n0x16c0 c0x0000 (---------------) + I game 0x002150c3, // n0x16c1 c0x0000 (---------------) + I gov 0x0025a343, // n0x16c2 c0x0000 (---------------) + I idv 0x0025f683, // n0x16c3 c0x0000 (---------------) + I mil 0x00239bc3, // n0x16c4 c0x0000 (---------------) + I net 0x002453c3, // n0x16c5 c0x0000 (---------------) + I org 0x002f748b, // n0x16c6 c0x0000 (---------------) + I xn--czrw28b 0x0034748a, // n0x16c7 c0x0000 (---------------) + I xn--uc0atv 0x0035218c, // n0x16c8 c0x0000 (---------------) + I xn--zf0ao64a 0x002028c2, // n0x16c9 c0x0000 (---------------) + I ac 0x00208f82, // n0x16ca c0x0000 (---------------) + I co 0x002053c2, // n0x16cb c0x0000 (---------------) + I go 0x0028ba85, // n0x16cc c0x0000 (---------------) + I hotel 0x002180c4, // n0x16cd c0x0000 (---------------) + I info 0x00208202, // n0x16ce c0x0000 (---------------) + I me 0x0025f683, // n0x16cf c0x0000 (---------------) + I mil 0x0020adc4, // n0x16d0 c0x0000 (---------------) + I mobi 0x00205f42, // n0x16d1 c0x0000 (---------------) + I ne 0x00204282, // n0x16d2 c0x0000 (---------------) + I or 0x00201e42, // n0x16d3 c0x0000 (---------------) + I sc 0x0027ecc2, // n0x16d4 c0x0000 (---------------) + I tv 0x002ba989, // n0x16d5 c0x0000 (---------------) + I cherkassy 0x00263cc8, // n0x16d6 c0x0000 (---------------) + I cherkasy 0x0027c249, // n0x16d7 c0x0000 (---------------) + I chernigov 0x0027f8c9, // n0x16d8 c0x0000 (---------------) + I chernihiv 0x00289bca, // n0x16d9 c0x0000 (---------------) + I chernivtsi 0x0028ad4a, // n0x16da c0x0000 (---------------) + I chernovtsy 0x00200c02, // n0x16db c0x0000 (---------------) + I ck 0x0022dc82, // n0x16dc c0x0000 (---------------) + I cn 0x00208f82, // n0x16dd c0x0000 (---------------) + I co 0x002104c3, // n0x16de c0x0000 (---------------) + I com 0x00239282, // n0x16df c0x0000 (---------------) + I cr 0x0023b546, // n0x16e0 c0x0000 (---------------) + I crimea 0x00317902, // n0x16e1 c0x0000 (---------------) + I cv 0x00207602, // n0x16e2 c0x0000 (---------------) + I dn 0x0031a28e, // n0x16e3 c0x0000 (---------------) + I dnepropetrovsk 0x00338f0e, // n0x16e4 c0x0000 (---------------) + I dnipropetrovsk 0x00263b47, // n0x16e5 c0x0000 (---------------) + I dominic 0x002ad0c7, // n0x16e6 c0x0000 (---------------) + I donetsk 0x002c0cc2, // n0x16e7 c0x0000 (---------------) + I dp 0x002ceec3, // n0x16e8 c0x0000 (---------------) + I edu 0x002150c3, // n0x16e9 c0x0000 (---------------) + I gov 0x00201a82, // n0x16ea c0x0000 (---------------) + I if 0x00200242, // n0x16eb c0x0000 (---------------) + I in 0x00352e8f, // n0x16ec c0x0000 (---------------) + I ivano-frankivsk 0x00244dc2, // n0x16ed c0x0000 (---------------) + I kh 0x00257847, // n0x16ee c0x0000 (---------------) + I kharkiv 0x0025a8c7, // n0x16ef c0x0000 (---------------) + I kharkov 0x00309b07, // n0x16f0 c0x0000 (---------------) + I kherson 0x002716cc, // n0x16f1 c0x0000 (---------------) + I khmelnitskiy 0x00274e0c, // n0x16f2 c0x0000 (---------------) + I khmelnytskyi 0x00205844, // n0x16f3 c0x0000 (---------------) + I kiev 0x00264e0a, // n0x16f4 c0x0000 (---------------) + I kirovograd 0x0031e782, // n0x16f5 c0x0000 (---------------) + I km 0x00203b82, // n0x16f6 c0x0000 (---------------) + I kr 0x0029b104, // n0x16f7 c0x0000 (---------------) + I krym 0x00203f02, // n0x16f8 c0x0000 (---------------) + I ks 0x002a4782, // n0x16f9 c0x0000 (---------------) + I kv 0x00275044, // n0x16fa c0x0000 (---------------) + I kyiv 0x002132c2, // n0x16fb c0x0000 (---------------) + I lg 0x00206502, // n0x16fc c0x0000 (---------------) + I lt 0x002a6787, // n0x16fd c0x0000 (---------------) + I lugansk 0x0022bbc5, // n0x16fe c0x0000 (---------------) + I lutsk 0x00203242, // n0x16ff c0x0000 (---------------) + I lv 0x00233c44, // n0x1700 c0x0000 (---------------) + I lviv 0x00326902, // n0x1701 c0x0000 (---------------) + I mk 0x00352d08, // n0x1702 c0x0000 (---------------) + I mykolaiv 0x00239bc3, // n0x1703 c0x0000 (---------------) + I net 0x00213d08, // n0x1704 c0x0000 (---------------) + I nikolaev 0x00202a02, // n0x1705 c0x0000 (---------------) + I od 0x00235885, // n0x1706 c0x0000 (---------------) + I odesa 0x0032ba06, // n0x1707 c0x0000 (---------------) + I odessa 0x002453c3, // n0x1708 c0x0000 (---------------) + I org 0x0020dcc2, // n0x1709 c0x0000 (---------------) + I pl 0x002c3007, // n0x170a c0x0000 (---------------) + I poltava 0x00208642, // n0x170b c0x0000 (---------------) + I pp 0x002c5845, // n0x170c c0x0000 (---------------) + I rivne 0x00238fc5, // n0x170d c0x0000 (---------------) + I rovno 0x0020af82, // n0x170e c0x0000 (---------------) + I rv 0x00231c42, // n0x170f c0x0000 (---------------) + I sb 0x002f338a, // n0x1710 c0x0000 (---------------) + I sebastopol 0x0034b44a, // n0x1711 c0x0000 (---------------) + I sevastopol 0x00215b42, // n0x1712 c0x0000 (---------------) + I sm 0x00296344, // n0x1713 c0x0000 (---------------) + I sumy 0x00201402, // n0x1714 c0x0000 (---------------) + I te 0x002fc348, // n0x1715 c0x0000 (---------------) + I ternopil 0x00204d42, // n0x1716 c0x0000 (---------------) + I uz 0x00251448, // n0x1717 c0x0000 (---------------) + I uzhgorod 0x002e2607, // n0x1718 c0x0000 (---------------) + I vinnica 0x002e2d09, // n0x1719 c0x0000 (---------------) + I vinnytsia 0x00213cc2, // n0x171a c0x0000 (---------------) + I vn 0x002e6085, // n0x171b c0x0000 (---------------) + I volyn 0x002dea05, // n0x171c c0x0000 (---------------) + I yalta 0x0029864b, // n0x171d c0x0000 (---------------) + I zaporizhzhe 0x0035388c, // n0x171e c0x0000 (---------------) + I zaporizhzhia 0x002e6448, // n0x171f c0x0000 (---------------) + I zhitomir 0x00270588, // n0x1720 c0x0000 (---------------) + I zhytomyr 0x002c71c2, // n0x1721 c0x0000 (---------------) + I zp 0x0020ef82, // n0x1722 c0x0000 (---------------) + I zt 0x002028c2, // n0x1723 c0x0000 (---------------) + I ac 0x00208f82, // n0x1724 c0x0000 (---------------) + I co 0x002104c3, // n0x1725 c0x0000 (---------------) + I com 0x002053c2, // n0x1726 c0x0000 (---------------) + I go 0x00205f42, // n0x1727 c0x0000 (---------------) + I ne 0x00204282, // n0x1728 c0x0000 (---------------) + I or 0x002453c3, // n0x1729 c0x0000 (---------------) + I org 0x00201e42, // n0x172a c0x0000 (---------------) + I sc 0x0060be42, // n0x172b c0x0001 (---------------) ! I bl 0x0061c54f, // n0x172c c0x0001 (---------------) ! I british-library 0x4b608f82, // n0x172d c0x012d (n0x1736-n0x1737) o I co 0x006dac83, // n0x172e c0x0001 (---------------) ! I jet 0x00650983, // n0x172f c0x0001 (---------------) ! I mod 0x00608b19, // n0x1730 c0x0001 (---------------) ! I national-library-scotland 0x00620f83, // n0x1731 c0x0001 (---------------) ! I nel 0x006131c3, // n0x1732 c0x0001 (---------------) ! I nic 0x00631643, // n0x1733 c0x0001 (---------------) ! I nls 0x0070900a, // n0x1734 c0x0001 (---------------) ! I parliament 0x01604343, // n0x1735 c0x0005 (---------------)* o I sch 0x00031c88, // n0x1736 c0x0000 (---------------) + blogspot 0x4be00782, // n0x1737 c0x012f (n0x1776-n0x1779) + I ak 0x4c201dc2, // n0x1738 c0x0130 (n0x1779-n0x177c) + I al 0x4c603902, // n0x1739 c0x0131 (n0x177c-n0x177f) + I ar 0x4ca00182, // n0x173a c0x0132 (n0x177f-n0x1782) + I as 0x4ce0b342, // n0x173b c0x0133 (n0x1782-n0x1785) + I az 0x4d200402, // n0x173c c0x0134 (n0x1785-n0x1788) + I ca 0x4d608f82, // n0x173d c0x0135 (n0x1788-n0x178b) + I co 0x4da31542, // n0x173e c0x0136 (n0x178b-n0x178e) + I ct 0x4de003c2, // n0x173f c0x0137 (n0x178e-n0x1791) + I dc 0x4e209102, // n0x1740 c0x0138 (n0x1791-n0x1794) + I de 0x002e01c3, // n0x1741 c0x0000 (---------------) + I dni 0x00252383, // n0x1742 c0x0000 (---------------) + I fed 0x4e641742, // n0x1743 c0x0139 (n0x1794-n0x1797) + I fl 0x4ea008c2, // n0x1744 c0x013a (n0x1797-n0x179a) + I ga 0x4ee07f02, // n0x1745 c0x013b (n0x179a-n0x179d) + I gu 0x4f200202, // n0x1746 c0x013c (n0x179d-n0x179f) + I hi 0x4f601102, // n0x1747 c0x013d (n0x179f-n0x17a2) + I ia 0x4fa0ab82, // n0x1748 c0x013e (n0x17a2-n0x17a5) + I id 0x4fe05682, // n0x1749 c0x013f (n0x17a5-n0x17a8) + I il 0x50200242, // n0x174a c0x0140 (n0x17a8-n0x17ab) + I in 0x000caf45, // n0x174b c0x0000 (---------------) + is-by 0x00226dc3, // n0x174c c0x0000 (---------------) + I isa 0x0031c804, // n0x174d c0x0000 (---------------) + I kids 0x50603f02, // n0x174e c0x0141 (n0x17ab-n0x17ae) + I ks 0x50a1ed02, // n0x174f c0x0142 (n0x17ae-n0x17b1) + I ky 0x50e000c2, // n0x1750 c0x0143 (n0x17b1-n0x17b4) + I la 0x0009fd4b, // n0x1751 c0x0000 (---------------) + land-4-sale 0x51200742, // n0x1752 c0x0144 (n0x17b4-n0x17b7) + I ma 0x51a106c2, // n0x1753 c0x0146 (n0x17ba-n0x17bd) + I md 0x51e08202, // n0x1754 c0x0147 (n0x17bd-n0x17c0) + I me 0x52200e02, // n0x1755 c0x0148 (n0x17c0-n0x17c3) + I mi 0x52603cc2, // n0x1756 c0x0149 (n0x17c3-n0x17c6) + I mn 0x52a0a782, // n0x1757 c0x014a (n0x17c6-n0x17c9) + I mo 0x52e22fc2, // n0x1758 c0x014b (n0x17c9-n0x17cc) + I ms 0x53252e82, // n0x1759 c0x014c (n0x17cc-n0x17cf) + I mt 0x53601f42, // n0x175a c0x014d (n0x17cf-n0x17d2) + I nc 0x53a00382, // n0x175b c0x014e (n0x17d2-n0x17d5) + I nd 0x53e05f42, // n0x175c c0x014f (n0x17d5-n0x17d8) + I ne 0x54213c02, // n0x175d c0x0150 (n0x17d8-n0x17db) + I nh 0x5460ee42, // n0x175e c0x0151 (n0x17db-n0x17de) + I nj 0x54a0ad82, // n0x175f c0x0152 (n0x17de-n0x17e1) + I nm 0x00225003, // n0x1760 c0x0000 (---------------) + I nsn 0x54e13442, // n0x1761 c0x0153 (n0x17e1-n0x17e4) + I nv 0x55216042, // n0x1762 c0x0154 (n0x17e4-n0x17e7) + I ny 0x5560a582, // n0x1763 c0x0155 (n0x17e7-n0x17ea) + I oh 0x55a00d42, // n0x1764 c0x0156 (n0x17ea-n0x17ed) + I ok 0x55e04282, // n0x1765 c0x0157 (n0x17ed-n0x17f0) + I or 0x56211382, // n0x1766 c0x0158 (n0x17f0-n0x17f3) + I pa 0x5660e2c2, // n0x1767 c0x0159 (n0x17f3-n0x17f6) + I pr 0x56a042c2, // n0x1768 c0x015a (n0x17f6-n0x17f9) + I ri 0x56e01e42, // n0x1769 c0x015b (n0x17f9-n0x17fc) + I sc 0x5724db82, // n0x176a c0x015c (n0x17fc-n0x17ff) + I sd 0x000ddfcc, // n0x176b c0x0000 (---------------) + stuff-4-sale 0x5760ff42, // n0x176c c0x015d (n0x17ff-n0x1802) + I tn 0x57a5b602, // n0x176d c0x015e (n0x1802-n0x1805) + I tx 0x57e0a2c2, // n0x176e c0x015f (n0x1805-n0x1808) + I ut 0x58202b82, // n0x176f c0x0160 (n0x1808-n0x180b) + I va 0x5860afc2, // n0x1770 c0x0161 (n0x180b-n0x180e) + I vi 0x58a5c582, // n0x1771 c0x0162 (n0x180e-n0x1811) + I vt 0x58e00142, // n0x1772 c0x0163 (n0x1811-n0x1814) + I wa 0x59207b02, // n0x1773 c0x0164 (n0x1814-n0x1817) + I wi 0x5965cdc2, // n0x1774 c0x0165 (n0x1817-n0x181a) + I wv 0x59a3b882, // n0x1775 c0x0166 (n0x181a-n0x181d) + I wy 0x00201942, // n0x1776 c0x0000 (---------------) + I cc 0x002edec3, // n0x1777 c0x0000 (---------------) + I k12 0x00208d43, // n0x1778 c0x0000 (---------------) + I lib 0x00201942, // n0x1779 c0x0000 (---------------) + I cc 0x002edec3, // n0x177a c0x0000 (---------------) + I k12 0x00208d43, // n0x177b c0x0000 (---------------) + I lib 0x00201942, // n0x177c c0x0000 (---------------) + I cc 0x002edec3, // n0x177d c0x0000 (---------------) + I k12 0x00208d43, // n0x177e c0x0000 (---------------) + I lib 0x00201942, // n0x177f c0x0000 (---------------) + I cc 0x002edec3, // n0x1780 c0x0000 (---------------) + I k12 0x00208d43, // n0x1781 c0x0000 (---------------) + I lib 0x00201942, // n0x1782 c0x0000 (---------------) + I cc 0x002edec3, // n0x1783 c0x0000 (---------------) + I k12 0x00208d43, // n0x1784 c0x0000 (---------------) + I lib 0x00201942, // n0x1785 c0x0000 (---------------) + I cc 0x002edec3, // n0x1786 c0x0000 (---------------) + I k12 0x00208d43, // n0x1787 c0x0000 (---------------) + I lib 0x00201942, // n0x1788 c0x0000 (---------------) + I cc 0x002edec3, // n0x1789 c0x0000 (---------------) + I k12 0x00208d43, // n0x178a c0x0000 (---------------) + I lib 0x00201942, // n0x178b c0x0000 (---------------) + I cc 0x002edec3, // n0x178c c0x0000 (---------------) + I k12 0x00208d43, // n0x178d c0x0000 (---------------) + I lib 0x00201942, // n0x178e c0x0000 (---------------) + I cc 0x002edec3, // n0x178f c0x0000 (---------------) + I k12 0x00208d43, // n0x1790 c0x0000 (---------------) + I lib 0x00201942, // n0x1791 c0x0000 (---------------) + I cc 0x002edec3, // n0x1792 c0x0000 (---------------) + I k12 0x00208d43, // n0x1793 c0x0000 (---------------) + I lib 0x00201942, // n0x1794 c0x0000 (---------------) + I cc 0x002edec3, // n0x1795 c0x0000 (---------------) + I k12 0x00208d43, // n0x1796 c0x0000 (---------------) + I lib 0x00201942, // n0x1797 c0x0000 (---------------) + I cc 0x002edec3, // n0x1798 c0x0000 (---------------) + I k12 0x00208d43, // n0x1799 c0x0000 (---------------) + I lib 0x00201942, // n0x179a c0x0000 (---------------) + I cc 0x002edec3, // n0x179b c0x0000 (---------------) + I k12 0x00208d43, // n0x179c c0x0000 (---------------) + I lib 0x00201942, // n0x179d c0x0000 (---------------) + I cc 0x00208d43, // n0x179e c0x0000 (---------------) + I lib 0x00201942, // n0x179f c0x0000 (---------------) + I cc 0x002edec3, // n0x17a0 c0x0000 (---------------) + I k12 0x00208d43, // n0x17a1 c0x0000 (---------------) + I lib 0x00201942, // n0x17a2 c0x0000 (---------------) + I cc 0x002edec3, // n0x17a3 c0x0000 (---------------) + I k12 0x00208d43, // n0x17a4 c0x0000 (---------------) + I lib 0x00201942, // n0x17a5 c0x0000 (---------------) + I cc 0x002edec3, // n0x17a6 c0x0000 (---------------) + I k12 0x00208d43, // n0x17a7 c0x0000 (---------------) + I lib 0x00201942, // n0x17a8 c0x0000 (---------------) + I cc 0x002edec3, // n0x17a9 c0x0000 (---------------) + I k12 0x00208d43, // n0x17aa c0x0000 (---------------) + I lib 0x00201942, // n0x17ab c0x0000 (---------------) + I cc 0x002edec3, // n0x17ac c0x0000 (---------------) + I k12 0x00208d43, // n0x17ad c0x0000 (---------------) + I lib 0x00201942, // n0x17ae c0x0000 (---------------) + I cc 0x002edec3, // n0x17af c0x0000 (---------------) + I k12 0x00208d43, // n0x17b0 c0x0000 (---------------) + I lib 0x00201942, // n0x17b1 c0x0000 (---------------) + I cc 0x002edec3, // n0x17b2 c0x0000 (---------------) + I k12 0x00208d43, // n0x17b3 c0x0000 (---------------) + I lib 0x00201942, // n0x17b4 c0x0000 (---------------) + I cc 0x516edec3, // n0x17b5 c0x0145 (n0x17b7-n0x17ba) + I k12 0x00208d43, // n0x17b6 c0x0000 (---------------) + I lib 0x0031b5c4, // n0x17b7 c0x0000 (---------------) + I chtr 0x002c1446, // n0x17b8 c0x0000 (---------------) + I paroch 0x002c75c3, // n0x17b9 c0x0000 (---------------) + I pvt 0x00201942, // n0x17ba c0x0000 (---------------) + I cc 0x002edec3, // n0x17bb c0x0000 (---------------) + I k12 0x00208d43, // n0x17bc c0x0000 (---------------) + I lib 0x00201942, // n0x17bd c0x0000 (---------------) + I cc 0x002edec3, // n0x17be c0x0000 (---------------) + I k12 0x00208d43, // n0x17bf c0x0000 (---------------) + I lib 0x00201942, // n0x17c0 c0x0000 (---------------) + I cc 0x002edec3, // n0x17c1 c0x0000 (---------------) + I k12 0x00208d43, // n0x17c2 c0x0000 (---------------) + I lib 0x00201942, // n0x17c3 c0x0000 (---------------) + I cc 0x002edec3, // n0x17c4 c0x0000 (---------------) + I k12 0x00208d43, // n0x17c5 c0x0000 (---------------) + I lib 0x00201942, // n0x17c6 c0x0000 (---------------) + I cc 0x002edec3, // n0x17c7 c0x0000 (---------------) + I k12 0x00208d43, // n0x17c8 c0x0000 (---------------) + I lib 0x00201942, // n0x17c9 c0x0000 (---------------) + I cc 0x002edec3, // n0x17ca c0x0000 (---------------) + I k12 0x00208d43, // n0x17cb c0x0000 (---------------) + I lib 0x00201942, // n0x17cc c0x0000 (---------------) + I cc 0x002edec3, // n0x17cd c0x0000 (---------------) + I k12 0x00208d43, // n0x17ce c0x0000 (---------------) + I lib 0x00201942, // n0x17cf c0x0000 (---------------) + I cc 0x002edec3, // n0x17d0 c0x0000 (---------------) + I k12 0x00208d43, // n0x17d1 c0x0000 (---------------) + I lib 0x00201942, // n0x17d2 c0x0000 (---------------) + I cc 0x002edec3, // n0x17d3 c0x0000 (---------------) + I k12 0x00208d43, // n0x17d4 c0x0000 (---------------) + I lib 0x00201942, // n0x17d5 c0x0000 (---------------) + I cc 0x002edec3, // n0x17d6 c0x0000 (---------------) + I k12 0x00208d43, // n0x17d7 c0x0000 (---------------) + I lib 0x00201942, // n0x17d8 c0x0000 (---------------) + I cc 0x002edec3, // n0x17d9 c0x0000 (---------------) + I k12 0x00208d43, // n0x17da c0x0000 (---------------) + I lib 0x00201942, // n0x17db c0x0000 (---------------) + I cc 0x002edec3, // n0x17dc c0x0000 (---------------) + I k12 0x00208d43, // n0x17dd c0x0000 (---------------) + I lib 0x00201942, // n0x17de c0x0000 (---------------) + I cc 0x002edec3, // n0x17df c0x0000 (---------------) + I k12 0x00208d43, // n0x17e0 c0x0000 (---------------) + I lib 0x00201942, // n0x17e1 c0x0000 (---------------) + I cc 0x002edec3, // n0x17e2 c0x0000 (---------------) + I k12 0x00208d43, // n0x17e3 c0x0000 (---------------) + I lib 0x00201942, // n0x17e4 c0x0000 (---------------) + I cc 0x002edec3, // n0x17e5 c0x0000 (---------------) + I k12 0x00208d43, // n0x17e6 c0x0000 (---------------) + I lib 0x00201942, // n0x17e7 c0x0000 (---------------) + I cc 0x002edec3, // n0x17e8 c0x0000 (---------------) + I k12 0x00208d43, // n0x17e9 c0x0000 (---------------) + I lib 0x00201942, // n0x17ea c0x0000 (---------------) + I cc 0x002edec3, // n0x17eb c0x0000 (---------------) + I k12 0x00208d43, // n0x17ec c0x0000 (---------------) + I lib 0x00201942, // n0x17ed c0x0000 (---------------) + I cc 0x002edec3, // n0x17ee c0x0000 (---------------) + I k12 0x00208d43, // n0x17ef c0x0000 (---------------) + I lib 0x00201942, // n0x17f0 c0x0000 (---------------) + I cc 0x002edec3, // n0x17f1 c0x0000 (---------------) + I k12 0x00208d43, // n0x17f2 c0x0000 (---------------) + I lib 0x00201942, // n0x17f3 c0x0000 (---------------) + I cc 0x002edec3, // n0x17f4 c0x0000 (---------------) + I k12 0x00208d43, // n0x17f5 c0x0000 (---------------) + I lib 0x00201942, // n0x17f6 c0x0000 (---------------) + I cc 0x002edec3, // n0x17f7 c0x0000 (---------------) + I k12 0x00208d43, // n0x17f8 c0x0000 (---------------) + I lib 0x00201942, // n0x17f9 c0x0000 (---------------) + I cc 0x002edec3, // n0x17fa c0x0000 (---------------) + I k12 0x00208d43, // n0x17fb c0x0000 (---------------) + I lib 0x00201942, // n0x17fc c0x0000 (---------------) + I cc 0x002edec3, // n0x17fd c0x0000 (---------------) + I k12 0x00208d43, // n0x17fe c0x0000 (---------------) + I lib 0x00201942, // n0x17ff c0x0000 (---------------) + I cc 0x002edec3, // n0x1800 c0x0000 (---------------) + I k12 0x00208d43, // n0x1801 c0x0000 (---------------) + I lib 0x00201942, // n0x1802 c0x0000 (---------------) + I cc 0x002edec3, // n0x1803 c0x0000 (---------------) + I k12 0x00208d43, // n0x1804 c0x0000 (---------------) + I lib 0x00201942, // n0x1805 c0x0000 (---------------) + I cc 0x002edec3, // n0x1806 c0x0000 (---------------) + I k12 0x00208d43, // n0x1807 c0x0000 (---------------) + I lib 0x00201942, // n0x1808 c0x0000 (---------------) + I cc 0x002edec3, // n0x1809 c0x0000 (---------------) + I k12 0x00208d43, // n0x180a c0x0000 (---------------) + I lib 0x00201942, // n0x180b c0x0000 (---------------) + I cc 0x002edec3, // n0x180c c0x0000 (---------------) + I k12 0x00208d43, // n0x180d c0x0000 (---------------) + I lib 0x00201942, // n0x180e c0x0000 (---------------) + I cc 0x002edec3, // n0x180f c0x0000 (---------------) + I k12 0x00208d43, // n0x1810 c0x0000 (---------------) + I lib 0x00201942, // n0x1811 c0x0000 (---------------) + I cc 0x002edec3, // n0x1812 c0x0000 (---------------) + I k12 0x00208d43, // n0x1813 c0x0000 (---------------) + I lib 0x00201942, // n0x1814 c0x0000 (---------------) + I cc 0x002edec3, // n0x1815 c0x0000 (---------------) + I k12 0x00208d43, // n0x1816 c0x0000 (---------------) + I lib 0x00201942, // n0x1817 c0x0000 (---------------) + I cc 0x002edec3, // n0x1818 c0x0000 (---------------) + I k12 0x00208d43, // n0x1819 c0x0000 (---------------) + I lib 0x00201942, // n0x181a c0x0000 (---------------) + I cc 0x002edec3, // n0x181b c0x0000 (---------------) + I k12 0x00208d43, // n0x181c c0x0000 (---------------) + I lib 0x002104c3, // n0x181d c0x0000 (---------------) + I com 0x002ceec3, // n0x181e c0x0000 (---------------) + I edu 0x002ed383, // n0x181f c0x0000 (---------------) + I gub 0x0025f683, // n0x1820 c0x0000 (---------------) + I mil 0x00239bc3, // n0x1821 c0x0000 (---------------) + I net 0x002453c3, // n0x1822 c0x0000 (---------------) + I org 0x00208f82, // n0x1823 c0x0000 (---------------) + I co 0x002104c3, // n0x1824 c0x0000 (---------------) + I com 0x00239bc3, // n0x1825 c0x0000 (---------------) + I net 0x002453c3, // n0x1826 c0x0000 (---------------) + I org 0x002104c3, // n0x1827 c0x0000 (---------------) + I com 0x002ceec3, // n0x1828 c0x0000 (---------------) + I edu 0x002150c3, // n0x1829 c0x0000 (---------------) + I gov 0x0025f683, // n0x182a c0x0000 (---------------) + I mil 0x00239bc3, // n0x182b c0x0000 (---------------) + I net 0x002453c3, // n0x182c c0x0000 (---------------) + I org 0x00208f82, // n0x182d c0x0000 (---------------) + I co 0x002104c3, // n0x182e c0x0000 (---------------) + I com 0x002fd1c3, // n0x182f c0x0000 (---------------) + I e12 0x002ceec3, // n0x1830 c0x0000 (---------------) + I edu 0x002150c3, // n0x1831 c0x0000 (---------------) + I gov 0x002180c4, // n0x1832 c0x0000 (---------------) + I info 0x0025f683, // n0x1833 c0x0000 (---------------) + I mil 0x00239bc3, // n0x1834 c0x0000 (---------------) + I net 0x002453c3, // n0x1835 c0x0000 (---------------) + I org 0x00209243, // n0x1836 c0x0000 (---------------) + I web 0x00208f82, // n0x1837 c0x0000 (---------------) + I co 0x002104c3, // n0x1838 c0x0000 (---------------) + I com 0x002edec3, // n0x1839 c0x0000 (---------------) + I k12 0x00239bc3, // n0x183a c0x0000 (---------------) + I net 0x002453c3, // n0x183b c0x0000 (---------------) + I org 0x002028c2, // n0x183c c0x0000 (---------------) + I ac 0x002b5183, // n0x183d c0x0000 (---------------) + I biz 0x002104c3, // n0x183e c0x0000 (---------------) + I com 0x002ceec3, // n0x183f c0x0000 (---------------) + I edu 0x002150c3, // n0x1840 c0x0000 (---------------) + I gov 0x0021a586, // n0x1841 c0x0000 (---------------) + I health 0x002180c4, // n0x1842 c0x0000 (---------------) + I info 0x0021fe43, // n0x1843 c0x0000 (---------------) + I int 0x002d16c4, // n0x1844 c0x0000 (---------------) + I name 0x00239bc3, // n0x1845 c0x0000 (---------------) + I net 0x002453c3, // n0x1846 c0x0000 (---------------) + I org 0x002c5983, // n0x1847 c0x0000 (---------------) + I pro 0x002104c3, // n0x1848 c0x0000 (---------------) + I com 0x00007546, // n0x1849 c0x0000 (---------------) + dyndns 0x002ceec3, // n0x184a c0x0000 (---------------) + I edu 0x002150c3, // n0x184b c0x0000 (---------------) + I gov 0x000963c6, // n0x184c c0x0000 (---------------) + mypets 0x00239bc3, // n0x184d c0x0000 (---------------) + I net 0x002453c3, // n0x184e c0x0000 (---------------) + I org } // children is the list of nodes' children, the parent's wildcard bit and the // parent's node type. If a node has no children then their children index // will be in the range [0, 6), depending on the wildcard bit and node type. // // The layout within the uint32, from MSB to LSB, is: // [ 1 bits] unused // [ 1 bits] wildcard bit // [ 2 bits] node type // [14 bits] high nodes index (exclusive) of children // [14 bits] low nodes index (inclusive) of children var children = [...]uint32{ 0x00000000, // c0x0000 (---------------) + 0x10000000, // c0x0001 (---------------) ! 0x20000000, // c0x0002 (---------------) o 0x40000000, // c0x0003 (---------------)* + 0x50000000, // c0x0004 (---------------)* ! 0x60000000, // c0x0005 (---------------)* o 0x005dc171, // c0x0006 (n0x0171-n0x0177) + 0x005e0177, // c0x0007 (n0x0177-n0x0178) + 0x005fc178, // c0x0008 (n0x0178-n0x017f) + 0x0076017f, // c0x0009 (n0x017f-n0x01d8) + 0x007741d8, // c0x000a (n0x01d8-n0x01dd) + 0x007881dd, // c0x000b (n0x01dd-n0x01e2) + 0x007981e2, // c0x000c (n0x01e2-n0x01e6) + 0x007b01e6, // c0x000d (n0x01e6-n0x01ec) + 0x007c01ec, // c0x000e (n0x01ec-n0x01f0) + 0x007d81f0, // c0x000f (n0x01f0-n0x01f6) + 0x007f81f6, // c0x0010 (n0x01f6-n0x01fe) + 0x007fc1fe, // c0x0011 (n0x01fe-n0x01ff) + 0x208141ff, // c0x0012 (n0x01ff-n0x0205) o 0x00818205, // c0x0013 (n0x0205-n0x0206) + 0x00834206, // c0x0014 (n0x0206-n0x020d) + 0x0083820d, // c0x0015 (n0x020d-n0x020e) + 0x2088420e, // c0x0016 (n0x020e-n0x0221) o 0x00888221, // c0x0017 (n0x0221-n0x0222) + 0x008a8222, // c0x0018 (n0x0222-n0x022a) + 0x008c422a, // c0x0019 (n0x022a-n0x0231) + 0x008c8231, // c0x001a (n0x0231-n0x0232) + 0x008f8232, // c0x001b (n0x0232-n0x023e) + 0x0092023e, // c0x001c (n0x023e-n0x0248) + 0x00940248, // c0x001d (n0x0248-n0x0250) + 0x00948250, // c0x001e (n0x0250-n0x0252) + 0x0094c252, // c0x001f (n0x0252-n0x0253) + 0x009dc253, // c0x0020 (n0x0253-n0x0277) + 0x009f0277, // c0x0021 (n0x0277-n0x027c) + 0x00a0427c, // c0x0022 (n0x027c-n0x0281) + 0x00a20281, // c0x0023 (n0x0281-n0x0288) + 0x00a30288, // c0x0024 (n0x0288-n0x028c) + 0x00a4428c, // c0x0025 (n0x028c-n0x0291) + 0x00a68291, // c0x0026 (n0x0291-n0x029a) + 0x00b7c29a, // c0x0027 (n0x029a-n0x02df) + 0x00b802df, // c0x0028 (n0x02df-n0x02e0) + 0x00b942e0, // c0x0029 (n0x02e0-n0x02e5) + 0x00ba82e5, // c0x002a (n0x02e5-n0x02ea) + 0x00bb02ea, // c0x002b (n0x02ea-n0x02ec) + 0x00bc02ec, // c0x002c (n0x02ec-n0x02f0) + 0x00bd42f0, // c0x002d (n0x02f0-n0x02f5) + 0x00c182f5, // c0x002e (n0x02f5-n0x0306) + 0x00c28306, // c0x002f (n0x0306-n0x030a) + 0x00c2c30a, // c0x0030 (n0x030a-n0x030b) + 0x00c3030b, // c0x0031 (n0x030b-n0x030c) + 0x00c3430c, // c0x0032 (n0x030c-n0x030d) + 0x00c7030d, // c0x0033 (n0x030d-n0x031c) + 0x60c7431c, // c0x0034 (n0x031c-n0x031d)* o 0x00c8431d, // c0x0035 (n0x031d-n0x0321) + 0x00c88321, // c0x0036 (n0x0321-n0x0322) + 0x00d38322, // c0x0037 (n0x0322-n0x034e) + 0x00d6c34e, // c0x0038 (n0x034e-n0x035b) + 0x0105035b, // c0x0039 (n0x035b-n0x0414) + 0x210ac414, // c0x003a (n0x0414-n0x042b) o 0x010cc42b, // c0x003b (n0x042b-n0x0433) + 0x010d4433, // c0x003c (n0x0433-n0x0435) + 0x010f0435, // c0x003d (n0x0435-n0x043c) + 0x0110843c, // c0x003e (n0x043c-n0x0442) + 0x0110c442, // c0x003f (n0x0442-n0x0443) + 0x0111c443, // c0x0040 (n0x0443-n0x0447) + 0x01124447, // c0x0041 (n0x0447-n0x0449) + 0x01128449, // c0x0042 (n0x0449-n0x044a) + 0x0114844a, // c0x0043 (n0x044a-n0x0452) + 0x0114c452, // c0x0044 (n0x0452-n0x0453) + 0x01160453, // c0x0045 (n0x0453-n0x0458) + 0x01188458, // c0x0046 (n0x0458-n0x0462) + 0x011a8462, // c0x0047 (n0x0462-n0x046a) + 0x011d846a, // c0x0048 (n0x046a-n0x0476) + 0x01200476, // c0x0049 (n0x0476-n0x0480) + 0x01224480, // c0x004a (n0x0480-n0x0489) + 0x01238489, // c0x004b (n0x0489-n0x048e) + 0x0123c48e, // c0x004c (n0x048e-n0x048f) + 0x0124848f, // c0x004d (n0x048f-n0x0492) + 0x012a8492, // c0x004e (n0x0492-n0x04aa) + 0x012c44aa, // c0x004f (n0x04aa-n0x04b1) + 0x012d84b1, // c0x0050 (n0x04b1-n0x04b6) + 0x012ec4b6, // c0x0051 (n0x04b6-n0x04bb) + 0x013044bb, // c0x0052 (n0x04bb-n0x04c1) + 0x2131c4c1, // c0x0053 (n0x04c1-n0x04c7) o 0x013344c7, // c0x0054 (n0x04c7-n0x04cd) + 0x0134c4cd, // c0x0055 (n0x04cd-n0x04d3) + 0x013684d3, // c0x0056 (n0x04d3-n0x04da) + 0x013744da, // c0x0057 (n0x04da-n0x04dd) + 0x013cc4dd, // c0x0058 (n0x04dd-n0x04f3) + 0x013e44f3, // c0x0059 (n0x04f3-n0x04f9) + 0x013f44f9, // c0x005a (n0x04f9-n0x04fd) + 0x014384fd, // c0x005b (n0x04fd-n0x050e) + 0x014b850e, // c0x005c (n0x050e-n0x052e) + 0x014e052e, // c0x005d (n0x052e-n0x0538) + 0x014e8538, // c0x005e (n0x0538-n0x053a) + 0x614ec53a, // c0x005f (n0x053a-n0x053b)* o 0x214f053b, // c0x0060 (n0x053b-n0x053c) o 0x0150853c, // c0x0061 (n0x053c-n0x0542) + 0x01510542, // c0x0062 (n0x0542-n0x0544) + 0x01544544, // c0x0063 (n0x0544-n0x0551) + 0x0156c551, // c0x0064 (n0x0551-n0x055b) + 0x0157055b, // c0x0065 (n0x055b-n0x055c) + 0x0157855c, // c0x0066 (n0x055c-n0x055e) + 0x0159055e, // c0x0067 (n0x055e-n0x0564) + 0x015b4564, // c0x0068 (n0x0564-n0x056d) + 0x015cc56d, // c0x0069 (n0x056d-n0x0573) + 0x01a24573, // c0x006a (n0x0573-n0x0689) + 0x01a38689, // c0x006b (n0x0689-n0x068e) + 0x01a5868e, // c0x006c (n0x068e-n0x0696) + 0x01b58696, // c0x006d (n0x0696-n0x06d6) + 0x01c2c6d6, // c0x006e (n0x06d6-n0x070b) + 0x01c9c70b, // c0x006f (n0x070b-n0x0727) + 0x01cf4727, // c0x0070 (n0x0727-n0x073d) + 0x01ddc73d, // c0x0071 (n0x073d-n0x0777) + 0x01e34777, // c0x0072 (n0x0777-n0x078d) + 0x01e7078d, // c0x0073 (n0x078d-n0x079c) + 0x01f6c79c, // c0x0074 (n0x079c-n0x07db) + 0x020387db, // c0x0075 (n0x07db-n0x080e) + 0x020d080e, // c0x0076 (n0x080e-n0x0834) + 0x02160834, // c0x0077 (n0x0834-n0x0858) + 0x021c4858, // c0x0078 (n0x0858-n0x0871) + 0x023fc871, // c0x0079 (n0x0871-n0x08ff) + 0x024b48ff, // c0x007a (n0x08ff-n0x092d) + 0x0258092d, // c0x007b (n0x092d-n0x0960) + 0x025cc960, // c0x007c (n0x0960-n0x0973) + 0x02658973, // c0x007d (n0x0973-n0x0996) + 0x02694996, // c0x007e (n0x0996-n0x09a5) + 0x026e49a5, // c0x007f (n0x09a5-n0x09b9) + 0x0275c9b9, // c0x0080 (n0x09b9-n0x09d7) + 0x627609d7, // c0x0081 (n0x09d7-n0x09d8)* o 0x627649d8, // c0x0082 (n0x09d8-n0x09d9)* o 0x627689d9, // c0x0083 (n0x09d9-n0x09da)* o 0x027e49da, // c0x0084 (n0x09da-n0x09f9) + 0x0284c9f9, // c0x0085 (n0x09f9-n0x0a13) + 0x028c8a13, // c0x0086 (n0x0a13-n0x0a32) + 0x02940a32, // c0x0087 (n0x0a32-n0x0a50) + 0x029c4a50, // c0x0088 (n0x0a50-n0x0a71) + 0x02a30a71, // c0x0089 (n0x0a71-n0x0a8c) + 0x02b5ca8c, // c0x008a (n0x0a8c-n0x0ad7) + 0x02bb4ad7, // c0x008b (n0x0ad7-n0x0aed) + 0x62bb8aed, // c0x008c (n0x0aed-n0x0aee)* o 0x02c50aee, // c0x008d (n0x0aee-n0x0b14) + 0x02cd8b14, // c0x008e (n0x0b14-n0x0b36) + 0x02d24b36, // c0x008f (n0x0b36-n0x0b49) + 0x02d8cb49, // c0x0090 (n0x0b49-n0x0b63) + 0x02e34b63, // c0x0091 (n0x0b63-n0x0b8d) + 0x02efcb8d, // c0x0092 (n0x0b8d-n0x0bbf) + 0x02f64bbf, // c0x0093 (n0x0bbf-n0x0bd9) + 0x03078bd9, // c0x0094 (n0x0bd9-n0x0c1e) + 0x6307cc1e, // c0x0095 (n0x0c1e-n0x0c1f)* o 0x63080c1f, // c0x0096 (n0x0c1f-n0x0c20)* o 0x030dcc20, // c0x0097 (n0x0c20-n0x0c37) + 0x03138c37, // c0x0098 (n0x0c37-n0x0c4e) + 0x031c8c4e, // c0x0099 (n0x0c4e-n0x0c72) + 0x03244c72, // c0x009a (n0x0c72-n0x0c91) + 0x03288c91, // c0x009b (n0x0c91-n0x0ca2) + 0x0336cca2, // c0x009c (n0x0ca2-n0x0cdb) + 0x033a0cdb, // c0x009d (n0x0cdb-n0x0ce8) + 0x03400ce8, // c0x009e (n0x0ce8-n0x0d00) + 0x03474d00, // c0x009f (n0x0d00-n0x0d1d) + 0x034fcd1d, // c0x00a0 (n0x0d1d-n0x0d3f) + 0x0353cd3f, // c0x00a1 (n0x0d3f-n0x0d4f) + 0x035acd4f, // c0x00a2 (n0x0d4f-n0x0d6b) + 0x635b0d6b, // c0x00a3 (n0x0d6b-n0x0d6c)* o 0x035c8d6c, // c0x00a4 (n0x0d6c-n0x0d72) + 0x035e4d72, // c0x00a5 (n0x0d72-n0x0d79) + 0x03628d79, // c0x00a6 (n0x0d79-n0x0d8a) + 0x03638d8a, // c0x00a7 (n0x0d8a-n0x0d8e) + 0x23650d8e, // c0x00a8 (n0x0d8e-n0x0d94) o 0x036c8d94, // c0x00a9 (n0x0d94-n0x0db2) + 0x036dcdb2, // c0x00aa (n0x0db2-n0x0db7) + 0x036f4db7, // c0x00ab (n0x0db7-n0x0dbd) + 0x03718dbd, // c0x00ac (n0x0dbd-n0x0dc6) + 0x2372cdc6, // c0x00ad (n0x0dc6-n0x0dcb) o 0x03744dcb, // c0x00ae (n0x0dcb-n0x0dd1) + 0x0377cdd1, // c0x00af (n0x0dd1-n0x0ddf) + 0x23790ddf, // c0x00b0 (n0x0ddf-n0x0de4) o 0x03798de4, // c0x00b1 (n0x0de4-n0x0de6) + 0x0379cde6, // c0x00b2 (n0x0de6-n0x0de7) + 0x037c0de7, // c0x00b3 (n0x0de7-n0x0df0) + 0x037e4df0, // c0x00b4 (n0x0df0-n0x0df9) + 0x037fcdf9, // c0x00b5 (n0x0df9-n0x0dff) + 0x03804dff, // c0x00b6 (n0x0dff-n0x0e01) + 0x03824e01, // c0x00b7 (n0x0e01-n0x0e09) + 0x03844e09, // c0x00b8 (n0x0e09-n0x0e11) + 0x03860e11, // c0x00b9 (n0x0e11-n0x0e18) + 0x0387ce18, // c0x00ba (n0x0e18-n0x0e1f) + 0x0388ce1f, // c0x00bb (n0x0e1f-n0x0e23) + 0x038a0e23, // c0x00bc (n0x0e23-n0x0e28) + 0x038a8e28, // c0x00bd (n0x0e28-n0x0e2a) + 0x038c4e2a, // c0x00be (n0x0e2a-n0x0e31) + 0x04154e31, // c0x00bf (n0x0e31-n0x1055) + 0x0418d055, // c0x00c0 (n0x1055-n0x1063) + 0x041b9063, // c0x00c1 (n0x1063-n0x106e) + 0x041d106e, // c0x00c2 (n0x106e-n0x1074) + 0x041ed074, // c0x00c3 (n0x1074-n0x107b) + 0x641f107b, // c0x00c4 (n0x107b-n0x107c)* o 0x0423507c, // c0x00c5 (n0x107c-n0x108d) + 0x0423d08d, // c0x00c6 (n0x108d-n0x108f) + 0x2424108f, // c0x00c7 (n0x108f-n0x1090) o 0x24245090, // c0x00c8 (n0x1090-n0x1091) o 0x04249091, // c0x00c9 (n0x1091-n0x1092) + 0x042f5092, // c0x00ca (n0x1092-n0x10bd) + 0x242fd0bd, // c0x00cb (n0x10bd-n0x10bf) o 0x243050bf, // c0x00cc (n0x10bf-n0x10c1) o 0x243110c1, // c0x00cd (n0x10c1-n0x10c4) o 0x043390c4, // c0x00ce (n0x10c4-n0x10ce) + 0x0435d0ce, // c0x00cf (n0x10ce-n0x10d7) + 0x043690d7, // c0x00d0 (n0x10d7-n0x10da) + 0x04ec10da, // c0x00d1 (n0x10da-n0x13b0) + 0x04ec53b0, // c0x00d2 (n0x13b0-n0x13b1) + 0x04ec93b1, // c0x00d3 (n0x13b1-n0x13b2) + 0x24ecd3b2, // c0x00d4 (n0x13b2-n0x13b3) o 0x04ed13b3, // c0x00d5 (n0x13b3-n0x13b4) + 0x24ed53b4, // c0x00d6 (n0x13b4-n0x13b5) o 0x04ed93b5, // c0x00d7 (n0x13b5-n0x13b6) + 0x24ee53b6, // c0x00d8 (n0x13b6-n0x13b9) o 0x04ee93b9, // c0x00d9 (n0x13b9-n0x13ba) + 0x04eed3ba, // c0x00da (n0x13ba-n0x13bb) + 0x24ef13bb, // c0x00db (n0x13bb-n0x13bc) o 0x04ef53bc, // c0x00dc (n0x13bc-n0x13bd) + 0x24efd3bd, // c0x00dd (n0x13bd-n0x13bf) o 0x04f013bf, // c0x00de (n0x13bf-n0x13c0) + 0x04f053c0, // c0x00df (n0x13c0-n0x13c1) + 0x24f153c1, // c0x00e0 (n0x13c1-n0x13c5) o 0x04f193c5, // c0x00e1 (n0x13c5-n0x13c6) + 0x04f1d3c6, // c0x00e2 (n0x13c6-n0x13c7) + 0x04f213c7, // c0x00e3 (n0x13c7-n0x13c8) + 0x04f253c8, // c0x00e4 (n0x13c8-n0x13c9) + 0x24f293c9, // c0x00e5 (n0x13c9-n0x13ca) o 0x04f2d3ca, // c0x00e6 (n0x13ca-n0x13cb) + 0x04f313cb, // c0x00e7 (n0x13cb-n0x13cc) + 0x04f353cc, // c0x00e8 (n0x13cc-n0x13cd) + 0x04f393cd, // c0x00e9 (n0x13cd-n0x13ce) + 0x24f413ce, // c0x00ea (n0x13ce-n0x13d0) o 0x04f453d0, // c0x00eb (n0x13d0-n0x13d1) + 0x04f493d1, // c0x00ec (n0x13d1-n0x13d2) + 0x04f4d3d2, // c0x00ed (n0x13d2-n0x13d3) + 0x24f513d3, // c0x00ee (n0x13d3-n0x13d4) o 0x04f553d4, // c0x00ef (n0x13d4-n0x13d5) + 0x24f5d3d5, // c0x00f0 (n0x13d5-n0x13d7) o 0x24f613d7, // c0x00f1 (n0x13d7-n0x13d8) o 0x04f7d3d8, // c0x00f2 (n0x13d8-n0x13df) + 0x04f893df, // c0x00f3 (n0x13df-n0x13e2) + 0x64f8d3e2, // c0x00f4 (n0x13e2-n0x13e3)* o 0x24f913e3, // c0x00f5 (n0x13e3-n0x13e4) o 0x04fdd3e4, // c0x00f6 (n0x13e4-n0x13f7) + 0x050b13f7, // c0x00f7 (n0x13f7-n0x142c) + 0x050b942c, // c0x00f8 (n0x142c-n0x142e) + 0x050e542e, // c0x00f9 (n0x142e-n0x1439) + 0x05101439, // c0x00fa (n0x1439-n0x1440) + 0x0510d440, // c0x00fb (n0x1440-n0x1443) + 0x0512d443, // c0x00fc (n0x1443-n0x144b) + 0x0516544b, // c0x00fd (n0x144b-n0x1459) + 0x05411459, // c0x00fe (n0x1459-n0x1504) + 0x05435504, // c0x00ff (n0x1504-n0x150d) + 0x0544950d, // c0x0100 (n0x150d-n0x1512) + 0x0547d512, // c0x0101 (n0x1512-n0x151f) + 0x0549951f, // c0x0102 (n0x151f-n0x1526) + 0x054b5526, // c0x0103 (n0x1526-n0x152d) + 0x054d952d, // c0x0104 (n0x152d-n0x1536) + 0x054f1536, // c0x0105 (n0x1536-n0x153c) + 0x0550d53c, // c0x0106 (n0x153c-n0x1543) + 0x0552d543, // c0x0107 (n0x1543-n0x154b) + 0x0553d54b, // c0x0108 (n0x154b-n0x154f) + 0x0556d54f, // c0x0109 (n0x154f-n0x155b) + 0x0558555b, // c0x010a (n0x155b-n0x1561) + 0x05799561, // c0x010b (n0x1561-n0x15e6) + 0x057bd5e6, // c0x010c (n0x15e6-n0x15ef) + 0x057dd5ef, // c0x010d (n0x15ef-n0x15f7) + 0x057f15f7, // c0x010e (n0x15f7-n0x15fc) + 0x058055fc, // c0x010f (n0x15fc-n0x1601) + 0x05825601, // c0x0110 (n0x1601-n0x1609) + 0x058c9609, // c0x0111 (n0x1609-n0x1632) + 0x058e5632, // c0x0112 (n0x1632-n0x1639) + 0x058f9639, // c0x0113 (n0x1639-n0x163e) + 0x058fd63e, // c0x0114 (n0x163e-n0x163f) + 0x0591163f, // c0x0115 (n0x163f-n0x1644) + 0x0592d644, // c0x0116 (n0x1644-n0x164b) + 0x0593964b, // c0x0117 (n0x164b-n0x164e) + 0x0596964e, // c0x0118 (n0x164e-n0x165a) + 0x0597d65a, // c0x0119 (n0x165a-n0x165f) + 0x0598165f, // c0x011a (n0x165f-n0x1660) + 0x05999660, // c0x011b (n0x1660-n0x1666) + 0x059a5666, // c0x011c (n0x1666-n0x1669) + 0x059a9669, // c0x011d (n0x1669-n0x166a) + 0x059c566a, // c0x011e (n0x166a-n0x1671) + 0x05a01671, // c0x011f (n0x1671-n0x1680) + 0x05a05680, // c0x0120 (n0x1680-n0x1681) + 0x05a25681, // c0x0121 (n0x1681-n0x1689) + 0x05a75689, // c0x0122 (n0x1689-n0x169d) + 0x05a8d69d, // c0x0123 (n0x169d-n0x16a3) + 0x65a956a3, // c0x0124 (n0x16a3-n0x16a5)* o 0x25a996a5, // c0x0125 (n0x16a5-n0x16a6) o 0x05add6a6, // c0x0126 (n0x16a6-n0x16b7) + 0x05aed6b7, // c0x0127 (n0x16b7-n0x16bb) + 0x05b256bb, // c0x0128 (n0x16bb-n0x16c9) + 0x25b556c9, // c0x0129 (n0x16c9-n0x16d5) o 0x05c8d6d5, // c0x012a (n0x16d5-n0x1723) + 0x05cad723, // c0x012b (n0x1723-n0x172b) + 0x65cd972b, // c0x012c (n0x172b-n0x1736)* o 0x25cdd736, // c0x012d (n0x1736-n0x1737) o 0x05dd9737, // c0x012e (n0x1737-n0x1776) + 0x05de5776, // c0x012f (n0x1776-n0x1779) + 0x05df1779, // c0x0130 (n0x1779-n0x177c) + 0x05dfd77c, // c0x0131 (n0x177c-n0x177f) + 0x05e0977f, // c0x0132 (n0x177f-n0x1782) + 0x05e15782, // c0x0133 (n0x1782-n0x1785) + 0x05e21785, // c0x0134 (n0x1785-n0x1788) + 0x05e2d788, // c0x0135 (n0x1788-n0x178b) + 0x05e3978b, // c0x0136 (n0x178b-n0x178e) + 0x05e4578e, // c0x0137 (n0x178e-n0x1791) + 0x05e51791, // c0x0138 (n0x1791-n0x1794) + 0x05e5d794, // c0x0139 (n0x1794-n0x1797) + 0x05e69797, // c0x013a (n0x1797-n0x179a) + 0x05e7579a, // c0x013b (n0x179a-n0x179d) + 0x05e7d79d, // c0x013c (n0x179d-n0x179f) + 0x05e8979f, // c0x013d (n0x179f-n0x17a2) + 0x05e957a2, // c0x013e (n0x17a2-n0x17a5) + 0x05ea17a5, // c0x013f (n0x17a5-n0x17a8) + 0x05ead7a8, // c0x0140 (n0x17a8-n0x17ab) + 0x05eb97ab, // c0x0141 (n0x17ab-n0x17ae) + 0x05ec57ae, // c0x0142 (n0x17ae-n0x17b1) + 0x05ed17b1, // c0x0143 (n0x17b1-n0x17b4) + 0x05edd7b4, // c0x0144 (n0x17b4-n0x17b7) + 0x05ee97b7, // c0x0145 (n0x17b7-n0x17ba) + 0x05ef57ba, // c0x0146 (n0x17ba-n0x17bd) + 0x05f017bd, // c0x0147 (n0x17bd-n0x17c0) + 0x05f0d7c0, // c0x0148 (n0x17c0-n0x17c3) + 0x05f197c3, // c0x0149 (n0x17c3-n0x17c6) + 0x05f257c6, // c0x014a (n0x17c6-n0x17c9) + 0x05f317c9, // c0x014b (n0x17c9-n0x17cc) + 0x05f3d7cc, // c0x014c (n0x17cc-n0x17cf) + 0x05f497cf, // c0x014d (n0x17cf-n0x17d2) + 0x05f557d2, // c0x014e (n0x17d2-n0x17d5) + 0x05f617d5, // c0x014f (n0x17d5-n0x17d8) + 0x05f6d7d8, // c0x0150 (n0x17d8-n0x17db) + 0x05f797db, // c0x0151 (n0x17db-n0x17de) + 0x05f857de, // c0x0152 (n0x17de-n0x17e1) + 0x05f917e1, // c0x0153 (n0x17e1-n0x17e4) + 0x05f9d7e4, // c0x0154 (n0x17e4-n0x17e7) + 0x05fa97e7, // c0x0155 (n0x17e7-n0x17ea) + 0x05fb57ea, // c0x0156 (n0x17ea-n0x17ed) + 0x05fc17ed, // c0x0157 (n0x17ed-n0x17f0) + 0x05fcd7f0, // c0x0158 (n0x17f0-n0x17f3) + 0x05fd97f3, // c0x0159 (n0x17f3-n0x17f6) + 0x05fe57f6, // c0x015a (n0x17f6-n0x17f9) + 0x05ff17f9, // c0x015b (n0x17f9-n0x17fc) + 0x05ffd7fc, // c0x015c (n0x17fc-n0x17ff) + 0x060097ff, // c0x015d (n0x17ff-n0x1802) + 0x06015802, // c0x015e (n0x1802-n0x1805) + 0x06021805, // c0x015f (n0x1805-n0x1808) + 0x0602d808, // c0x0160 (n0x1808-n0x180b) + 0x0603980b, // c0x0161 (n0x180b-n0x180e) + 0x0604580e, // c0x0162 (n0x180e-n0x1811) + 0x06051811, // c0x0163 (n0x1811-n0x1814) + 0x0605d814, // c0x0164 (n0x1814-n0x1817) + 0x06069817, // c0x0165 (n0x1817-n0x181a) + 0x0607581a, // c0x0166 (n0x181a-n0x181d) + 0x0608d81d, // c0x0167 (n0x181d-n0x1823) + 0x0609d823, // c0x0168 (n0x1823-n0x1827) + 0x060b5827, // c0x0169 (n0x1827-n0x182d) + 0x060dd82d, // c0x016a (n0x182d-n0x1837) + 0x060f1837, // c0x016b (n0x1837-n0x183c) + 0x0612183c, // c0x016c (n0x183c-n0x1848) + 0x0613d848, // c0x016d (n0x1848-n0x184f) + } ���������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/publicsuffix/list.go�������������������������������������������������������������������������0000644�0001751�0001751�00000007363�12235217213�015340� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// 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. // Package publicsuffix provides a public suffix list based on data from // http://publicsuffix.org/. A public suffix is one under which Internet users // can directly register names. package publicsuffix // TODO: specify case sensitivity and leading/trailing dot behavior for // func PublicSuffix and func EffectiveTLDPlusOne. import ( "fmt" "net/http/cookiejar" "strings" ) // List implements the cookiejar.PublicSuffixList interface by calling the // PublicSuffix function. var List cookiejar.PublicSuffixList = list{} type list struct{} func (list) PublicSuffix(domain string) string { ps, _ := PublicSuffix(domain) return ps } func (list) String() string { return version } // PublicSuffix returns the public suffix of the domain using a copy of the // publicsuffix.org database compiled into the library. // // icann is whether the public suffix is managed by the Internet Corporation // for Assigned Names and Numbers. If not, the public suffix is privately // managed. For example, foo.org and foo.co.uk are ICANN domains, // foo.dyndns.org and foo.blogspot.co.uk are private domains. // // Use cases for distinguishing ICANN domains like foo.com from private // domains like foo.appspot.com can be found at // https://wiki.mozilla.org/Public_Suffix_List/Use_Cases func PublicSuffix(domain string) (publicSuffix string, icann bool) { lo, hi := uint32(0), uint32(numTLD) s, suffix, wildcard := domain, len(domain), false loop: for { dot := strings.LastIndex(s, ".") if wildcard { suffix = 1 + dot } if lo == hi { break } f := find(s[1+dot:], lo, hi) if f == notFound { break } u := nodes[f] >> (nodesBitsTextOffset + nodesBitsTextLength) icann = u&(1<<nodesBitsICANN-1) != 0 u >>= nodesBitsICANN u = children[u&(1<<nodesBitsChildren-1)] lo = u & (1<<childrenBitsLo - 1) u >>= childrenBitsLo hi = u & (1<<childrenBitsHi - 1) u >>= childrenBitsHi switch u & (1<<childrenBitsNodeType - 1) { case nodeTypeNormal: suffix = 1 + dot case nodeTypeException: suffix = 1 + len(s) break loop } u >>= childrenBitsNodeType wildcard = u&(1<<childrenBitsWildcard-1) != 0 if dot == -1 { break } s = s[:dot] } if suffix == len(domain) { // If no rules match, the prevailing rule is "*". return domain[1+strings.LastIndex(domain, "."):], icann } return domain[suffix:], icann } const notFound uint32 = 1<<32 - 1 // find returns the index of the node in the range [lo, hi) whose label equals // label, or notFound if there is no such node. The range is assumed to be in // strictly increasing node label order. func find(label string, lo, hi uint32) uint32 { for lo < hi { mid := lo + (hi-lo)/2 s := nodeLabel(mid) if s < label { lo = mid + 1 } else if s == label { return mid } else { hi = mid } } return notFound } // nodeLabel returns the label for the i'th node. func nodeLabel(i uint32) string { x := nodes[i] length := x & (1<<nodesBitsTextLength - 1) x >>= nodesBitsTextLength offset := x & (1<<nodesBitsTextOffset - 1) return text[offset : offset+length] } // EffectiveTLDPlusOne returns the effective top level domain plus one more // label. For example, the eTLD+1 for "foo.bar.golang.org" is "golang.org". func EffectiveTLDPlusOne(domain string) (string, error) { suffix, _ := PublicSuffix(domain) if len(domain) <= len(suffix) { return "", fmt.Errorf("publicsuffix: cannot derive eTLD+1 for domain %q", domain) } i := len(domain) - len(suffix) - 1 if domain[i] != '.' { return "", fmt.Errorf("publicsuffix: invalid public suffix %q for domain %q", suffix, domain) } return domain[1+strings.LastIndex(domain[:i], "."):], nil } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/publicsuffix/gen.go��������������������������������������������������������������������������0000644�0001751�0001751�00000035743�12235217213�015141� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build ignore package main // This program generates table.go and table_test.go. // Invoke as: // // go run gen.go -version "xxx" >table.go // go run gen.go -version "xxx" -test >table_test.go // // The version is derived from information found at // http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat // which is linked from http://publicsuffix.org/list/. // // To fetch a particular hg revision, such as 05b11a8d1ace, pass // -url "http://hg.mozilla.org/mozilla-central/raw-file/05b11a8d1ace/netwerk/dns/effective_tld_names.dat" import ( "bufio" "bytes" "flag" "fmt" "go/format" "io" "net/http" "os" "sort" "strings" "code.google.com/p/go.net/idna" ) const ( nodesBitsChildren = 9 nodesBitsICANN = 1 nodesBitsTextOffset = 15 nodesBitsTextLength = 6 childrenBitsWildcard = 1 childrenBitsNodeType = 2 childrenBitsHi = 14 childrenBitsLo = 14 ) const ( nodeTypeNormal = 0 nodeTypeException = 1 nodeTypeParentOnly = 2 numNodeType = 3 ) func nodeTypeStr(n int) string { switch n { case nodeTypeNormal: return "+" case nodeTypeException: return "!" case nodeTypeParentOnly: return "o" } panic("unreachable") } var ( labelEncoding = map[string]uint32{} labelsList = []string{} labelsMap = map[string]bool{} rules = []string{} crush = flag.Bool("crush", true, "make the generated node text as small as possible") subset = flag.Bool("subset", false, "generate only a subset of the full table, for debugging") url = flag.String("url", "http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1", "URL of the publicsuffix.org list. If empty, stdin is read instead") v = flag.Bool("v", false, "verbose output (to stderr)") version = flag.String("version", "", "the effective_tld_names.dat version") test = flag.Bool("test", false, "generate table_test.go") ) func main() { if err := main1(); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } } func main1() error { flag.Parse() if nodesBitsTextLength+nodesBitsTextOffset+nodesBitsICANN+nodesBitsChildren > 32 { return fmt.Errorf("not enough bits to encode the nodes table") } if childrenBitsLo+childrenBitsHi+childrenBitsNodeType+childrenBitsWildcard > 32 { return fmt.Errorf("not enough bits to encode the children table") } if *version == "" { return fmt.Errorf("-version was not specified") } var r io.Reader = os.Stdin if *url != "" { res, err := http.Get(*url) if err != nil { return err } if res.StatusCode != http.StatusOK { return fmt.Errorf("bad GET status for %s: %d", *url, res.Status) } r = res.Body defer res.Body.Close() } var root node icann := false buf := new(bytes.Buffer) br := bufio.NewReader(r) for { s, err := br.ReadString('\n') if err != nil { if err == io.EOF { break } return err } s = strings.TrimSpace(s) if strings.Contains(s, "BEGIN ICANN DOMAINS") { icann = true continue } if strings.Contains(s, "END ICANN DOMAINS") { icann = false continue } if s == "" || strings.HasPrefix(s, "//") { continue } s, err = idna.ToASCII(s) if err != nil { return err } if *subset { switch { case s == "ac.jp" || strings.HasSuffix(s, ".ac.jp"): case s == "ak.us" || strings.HasSuffix(s, ".ak.us"): case s == "ao" || strings.HasSuffix(s, ".ao"): case s == "ar" || strings.HasSuffix(s, ".ar"): case s == "arpa" || strings.HasSuffix(s, ".arpa"): case s == "cy" || strings.HasSuffix(s, ".cy"): case s == "dyndns.org" || strings.HasSuffix(s, ".dyndns.org"): case s == "jp": case s == "kobe.jp" || strings.HasSuffix(s, ".kobe.jp"): case s == "kyoto.jp" || strings.HasSuffix(s, ".kyoto.jp"): case s == "om" || strings.HasSuffix(s, ".om"): case s == "uk" || strings.HasSuffix(s, ".uk"): case s == "uk.com" || strings.HasSuffix(s, ".uk.com"): case s == "tw" || strings.HasSuffix(s, ".tw"): case s == "zw" || strings.HasSuffix(s, ".zw"): case s == "xn--p1ai" || strings.HasSuffix(s, ".xn--p1ai"): // xn--p1ai is Russian-Cyrillic "рф". default: continue } } rules = append(rules, s) nt, wildcard := nodeTypeNormal, false switch { case strings.HasPrefix(s, "*."): s, nt = s[2:], nodeTypeParentOnly wildcard = true case strings.HasPrefix(s, "!"): s, nt = s[1:], nodeTypeException } labels := strings.Split(s, ".") for n, i := &root, len(labels)-1; i >= 0; i-- { label := labels[i] n = n.child(label) if i == 0 { if nt != nodeTypeParentOnly && n.nodeType == nodeTypeParentOnly { n.nodeType = nt } n.icann = n.icann && icann n.wildcard = n.wildcard || wildcard } labelsMap[label] = true } } labelsList = make([]string, 0, len(labelsMap)) for label := range labelsMap { labelsList = append(labelsList, label) } sort.Strings(labelsList) p := printReal if *test { p = printTest } if err := p(buf, &root); err != nil { return err } b, err := format.Source(buf.Bytes()) if err != nil { return err } _, err = os.Stdout.Write(b) return err } func printTest(w io.Writer, n *node) error { fmt.Fprintf(w, "// generated by go run gen.go; DO NOT EDIT\n\n") fmt.Fprintf(w, "package publicsuffix\n\nvar rules = [...]string{\n") for _, rule := range rules { fmt.Fprintf(w, "%q,\n", rule) } fmt.Fprintf(w, "}\n\nvar nodeLabels = [...]string{\n") if err := n.walk(w, printNodeLabel); err != nil { return err } fmt.Fprintf(w, "}\n") return nil } func printReal(w io.Writer, n *node) error { const header = `// generated by go run gen.go; DO NOT EDIT package publicsuffix const version = %q const ( nodesBitsChildren = %d nodesBitsICANN = %d nodesBitsTextOffset = %d nodesBitsTextLength = %d childrenBitsWildcard = %d childrenBitsNodeType = %d childrenBitsHi = %d childrenBitsLo = %d ) const ( nodeTypeNormal = %d nodeTypeException = %d nodeTypeParentOnly = %d ) // numTLD is the number of top level domains. const numTLD = %d ` fmt.Fprintf(w, header, *version, nodesBitsChildren, nodesBitsICANN, nodesBitsTextOffset, nodesBitsTextLength, childrenBitsWildcard, childrenBitsNodeType, childrenBitsHi, childrenBitsLo, nodeTypeNormal, nodeTypeException, nodeTypeParentOnly, len(n.children)) text := makeText() if text == "" { return fmt.Errorf("internal error: makeText returned no text") } for _, label := range labelsList { offset, length := strings.Index(text, label), len(label) if offset < 0 { return fmt.Errorf("internal error: could not find %q in text %q", label, text) } if offset >= 1<<nodesBitsTextOffset || length >= 1<<nodesBitsTextLength { return fmt.Errorf("text offset/length is too large: %d/%d", offset, length) } labelEncoding[label] = uint32(offset)<<nodesBitsTextLength | uint32(length) } fmt.Fprintf(w, "// Text is the combined text of all labels.\nconst text = ") for len(text) > 0 { n, plus := len(text), "" if n > 64 { n, plus = 64, " +" } fmt.Fprintf(w, "%q%s\n", text[:n], plus) text = text[n:] } n.walk(w, assignIndexes) fmt.Fprintf(w, ` // 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 // the children array), ICANN bit and text. // // In the //-comment after each node's data, the nodes indexes of the children // are formatted as (n0x1234-n0x1256), with * denoting the wildcard bit. The // nodeType is printed as + for normal, ! for exception, and o for parent-only // nodes that have children but don't match a domain label in their own right. // An I denotes an ICANN domain. // // The layout within the uint32, from MSB to LSB, is: // [%2d bits] unused // [%2d bits] children index // [%2d bits] ICANN bit // [%2d bits] text index // [%2d bits] text length var nodes = [...]uint32{ `, 32-nodesBitsChildren-nodesBitsICANN-nodesBitsTextOffset-nodesBitsTextLength, nodesBitsChildren, nodesBitsICANN, nodesBitsTextOffset, nodesBitsTextLength) if err := n.walk(w, printNode); err != nil { return err } fmt.Fprintf(w, `} // children is the list of nodes' children, the parent's wildcard bit and the // parent's node type. If a node has no children then their children index // will be in the range [0, 6), depending on the wildcard bit and node type. // // The layout within the uint32, from MSB to LSB, is: // [%2d bits] unused // [%2d bits] wildcard bit // [%2d bits] node type // [%2d bits] high nodes index (exclusive) of children // [%2d bits] low nodes index (inclusive) of children var children=[...]uint32{ `, 32-childrenBitsWildcard-childrenBitsNodeType-childrenBitsHi-childrenBitsLo, childrenBitsWildcard, childrenBitsNodeType, childrenBitsHi, childrenBitsLo) for i, c := range childrenEncoding { s := "---------------" lo := c & (1<<childrenBitsLo - 1) hi := (c >> childrenBitsLo) & (1<<childrenBitsHi - 1) if lo != hi { s = fmt.Sprintf("n0x%04x-n0x%04x", lo, hi) } nodeType := int(c>>(childrenBitsLo+childrenBitsHi)) & (1<<childrenBitsNodeType - 1) wildcard := c>>(childrenBitsLo+childrenBitsHi+childrenBitsNodeType) != 0 fmt.Fprintf(w, "0x%08x, // c0x%04x (%s)%s %s\n", c, i, s, wildcardStr(wildcard), nodeTypeStr(nodeType)) } fmt.Fprintf(w, "}\n") return nil } type node struct { label string nodeType int icann bool wildcard bool // nodesIndex and childrenIndex are the index of this node in the nodes // and the index of its children offset/length in the children arrays. nodesIndex, childrenIndex int // firstChild is the index of this node's first child, or zero if this // node has no children. firstChild int // children are the node's children, in strictly increasing node label order. children []*node } func (n *node) walk(w io.Writer, f func(w1 io.Writer, n1 *node) error) error { if err := f(w, n); err != nil { return err } for _, c := range n.children { if err := c.walk(w, f); err != nil { return err } } return nil } // child returns the child of n with the given label. The child is created if // it did not exist beforehand. func (n *node) child(label string) *node { for _, c := range n.children { if c.label == label { return c } } c := &node{ label: label, nodeType: nodeTypeParentOnly, icann: true, } n.children = append(n.children, c) sort.Sort(byLabel(n.children)) return c } type byLabel []*node func (b byLabel) Len() int { return len(b) } func (b byLabel) Swap(i, j int) { b[i], b[j] = b[j], b[i] } func (b byLabel) Less(i, j int) bool { return b[i].label < b[j].label } var nextNodesIndex int // childrenEncoding are the encoded entries in the generated children array. // All these pre-defined entries have no children. var childrenEncoding = []uint32{ 0 << (childrenBitsLo + childrenBitsHi), // Without wildcard bit, nodeTypeNormal. 1 << (childrenBitsLo + childrenBitsHi), // Without wildcard bit, nodeTypeException. 2 << (childrenBitsLo + childrenBitsHi), // Without wildcard bit, nodeTypeParentOnly. 4 << (childrenBitsLo + childrenBitsHi), // With wildcard bit, nodeTypeNormal. 5 << (childrenBitsLo + childrenBitsHi), // With wildcard bit, nodeTypeException. 6 << (childrenBitsLo + childrenBitsHi), // With wildcard bit, nodeTypeParentOnly. } var firstCallToAssignIndexes = true func assignIndexes(w io.Writer, n *node) error { if len(n.children) != 0 { // Assign nodesIndex. n.firstChild = nextNodesIndex for _, c := range n.children { c.nodesIndex = nextNodesIndex nextNodesIndex++ } // The root node's children is implicit. if firstCallToAssignIndexes { firstCallToAssignIndexes = false return nil } // Assign childrenIndex. if len(childrenEncoding) >= 1<<nodesBitsChildren { return fmt.Errorf("children table is too large") } n.childrenIndex = len(childrenEncoding) lo := uint32(n.firstChild) hi := lo + uint32(len(n.children)) if lo >= 1<<childrenBitsLo || hi >= 1<<childrenBitsHi { return fmt.Errorf("children lo/hi is too large: %d/%d", lo, hi) } enc := hi<<childrenBitsLo | lo enc |= uint32(n.nodeType) << (childrenBitsLo + childrenBitsHi) if n.wildcard { enc |= 1 << (childrenBitsLo + childrenBitsHi + childrenBitsNodeType) } childrenEncoding = append(childrenEncoding, enc) } else { n.childrenIndex = n.nodeType if n.wildcard { n.childrenIndex += numNodeType } } return nil } func printNode(w io.Writer, n *node) error { for _, c := range n.children { s := "---------------" if len(c.children) != 0 { s = fmt.Sprintf("n0x%04x-n0x%04x", c.firstChild, c.firstChild+len(c.children)) } encoding := labelEncoding[c.label] if c.icann { encoding |= 1 << (nodesBitsTextLength + nodesBitsTextOffset) } encoding |= uint32(c.childrenIndex) << (nodesBitsTextLength + nodesBitsTextOffset + nodesBitsICANN) fmt.Fprintf(w, "0x%08x, // n0x%04x c0x%04x (%s)%s %s %s %s\n", encoding, c.nodesIndex, c.childrenIndex, s, wildcardStr(c.wildcard), nodeTypeStr(c.nodeType), icannStr(c.icann), c.label, ) } return nil } func printNodeLabel(w io.Writer, n *node) error { for _, c := range n.children { fmt.Fprintf(w, "%q,\n", c.label) } return nil } func icannStr(icann bool) string { if icann { return "I" } return " " } func wildcardStr(wildcard bool) string { if wildcard { return "*" } return " " } // makeText combines all the strings in labelsList to form one giant string. // If the crush flag is true, then overlapping strings will be merged: "arpa" // and "parliament" could yield "arparliament". func makeText() string { if !*crush { return strings.Join(labelsList, "") } beforeLength := 0 for _, s := range labelsList { beforeLength += len(s) } // Make a copy of labelsList. ss := append(make([]string, 0, len(labelsList)), labelsList...) // Remove strings that are substrings of other strings. for changed := true; changed; { changed = false for i, s := range ss { if s == "" { continue } for j, t := range ss { if i != j && t != "" && strings.Contains(s, t) { changed = true ss[j] = "" } } } } // Remove the empty strings. sort.Strings(ss) for len(ss) > 0 && ss[0] == "" { ss = ss[1:] } // Join strings where one suffix matches another prefix. for { // Find best i, j, k such that ss[i][len-k:] == ss[j][:k], // maximizing overlap length k. besti := -1 bestj := -1 bestk := 0 for i, s := range ss { if s == "" { continue } for j, t := range ss { if i == j { continue } for k := bestk + 1; k <= len(s) && k <= len(t); k++ { if s[len(s)-k:] == t[:k] { besti = i bestj = j bestk = k } } } } if bestk > 0 { if *v { fmt.Fprintf(os.Stderr, "%d-length overlap at (%4d,%4d) out of (%4d,%4d): %q and %q\n", bestk, besti, bestj, len(ss), len(ss), ss[besti], ss[bestj]) } ss[besti] += ss[bestj][bestk:] ss[bestj] = "" continue } break } text := strings.Join(ss, "") if *v { fmt.Fprintf(os.Stderr, "crushed %d bytes to become %d bytes\n", beforeLength, len(text)) } return text } �����������������������������go.net/publicsuffix/list_test.go��������������������������������������������������������������������0000644�0001751�0001751�00000022253�12235217213�016372� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// 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. package publicsuffix import ( "sort" "strings" "testing" ) func TestNodeLabel(t *testing.T) { for i, want := range nodeLabels { got := nodeLabel(uint32(i)) if got != want { t.Errorf("%d: got %q, want %q", i, got, want) } } } func TestFind(t *testing.T) { testCases := []string{ "", "a", "a0", "aaaa", "ao", "ap", "ar", "aro", "arp", "arpa", "arpaa", "arpb", "az", "b", "b0", "ba", "z", "zu", "zv", "zw", "zx", "zy", "zz", "zzzz", } for _, tc := range testCases { got := find(tc, 0, numTLD) want := notFound for i := uint32(0); i < numTLD; i++ { if tc == nodeLabel(i) { want = i break } } if got != want { t.Errorf("%q: got %d, want %d", tc, got, want) } } } func TestICANN(t *testing.T) { testCases := map[string]bool{ "foo.org": true, "foo.co.uk": true, "foo.dyndns.org": false, "foo.go.dyndns.org": false, "foo.blogspot.co.uk": false, "foo.intranet": false, } for domain, want := range testCases { _, got := PublicSuffix(domain) if got != want { t.Errorf("%q: got %v, want %v", domain, got, want) } } } var publicSuffixTestCases = []struct { domain, want string }{ // Empty string. {"", ""}, // The .ao rules are: // ao // ed.ao // gv.ao // og.ao // co.ao // pb.ao // it.ao {"ao", "ao"}, {"www.ao", "ao"}, {"pb.ao", "pb.ao"}, {"www.pb.ao", "pb.ao"}, {"www.xxx.yyy.zzz.pb.ao", "pb.ao"}, // The .ar rules are: // ar // com.ar // edu.ar // gob.ar // int.ar // mil.ar // net.ar // org.ar // tur.ar // blogspot.com.ar {"ar", "ar"}, {"www.ar", "ar"}, {"nic.ar", "ar"}, {"www.nic.ar", "ar"}, {"com.ar", "com.ar"}, {"www.com.ar", "com.ar"}, {"blogspot.com.ar", "blogspot.com.ar"}, {"www.blogspot.com.ar", "blogspot.com.ar"}, {"www.xxx.yyy.zzz.blogspot.com.ar", "blogspot.com.ar"}, {"logspot.com.ar", "com.ar"}, {"zlogspot.com.ar", "com.ar"}, {"zblogspot.com.ar", "com.ar"}, // The .arpa rules are: // e164.arpa // in-addr.arpa // ip6.arpa // iris.arpa // uri.arpa // urn.arpa {"arpa", "arpa"}, {"www.arpa", "arpa"}, {"urn.arpa", "urn.arpa"}, {"www.urn.arpa", "urn.arpa"}, {"www.xxx.yyy.zzz.urn.arpa", "urn.arpa"}, // The relevant {kobe,kyoto}.jp rules are: // jp // *.kobe.jp // !city.kobe.jp // kyoto.jp // ide.kyoto.jp {"jp", "jp"}, {"kobe.jp", "jp"}, {"c.kobe.jp", "c.kobe.jp"}, {"b.c.kobe.jp", "c.kobe.jp"}, {"a.b.c.kobe.jp", "c.kobe.jp"}, {"city.kobe.jp", "kobe.jp"}, {"www.city.kobe.jp", "kobe.jp"}, {"kyoto.jp", "kyoto.jp"}, {"test.kyoto.jp", "kyoto.jp"}, {"ide.kyoto.jp", "ide.kyoto.jp"}, {"b.ide.kyoto.jp", "ide.kyoto.jp"}, {"a.b.ide.kyoto.jp", "ide.kyoto.jp"}, // The .tw rules are: // tw // edu.tw // gov.tw // mil.tw // com.tw // net.tw // org.tw // idv.tw // game.tw // ebiz.tw // club.tw // 網路.tw (xn--zf0ao64a.tw) // 組織.tw (xn--uc0atv.tw) // 商業.tw (xn--czrw28b.tw) // blogspot.tw {"tw", "tw"}, {"aaa.tw", "tw"}, {"www.aaa.tw", "tw"}, {"xn--czrw28b.aaa.tw", "tw"}, {"edu.tw", "edu.tw"}, {"www.edu.tw", "edu.tw"}, {"xn--czrw28b.edu.tw", "edu.tw"}, {"xn--czrw28b.tw", "xn--czrw28b.tw"}, {"www.xn--czrw28b.tw", "xn--czrw28b.tw"}, {"xn--uc0atv.xn--czrw28b.tw", "xn--czrw28b.tw"}, {"xn--kpry57d.tw", "tw"}, // The .uk rules are: // *.uk // *.sch.uk // !bl.uk // !british-library.uk // !jet.uk // !mod.uk // !national-library-scotland.uk // !nel.uk // !nic.uk // !nls.uk // !parliament.uk // blogspot.co.uk {"uk", "uk"}, {"aaa.uk", "aaa.uk"}, {"www.aaa.uk", "aaa.uk"}, {"mod.uk", "uk"}, {"www.mod.uk", "uk"}, {"sch.uk", "sch.uk"}, {"mod.sch.uk", "mod.sch.uk"}, {"www.sch.uk", "www.sch.uk"}, {"blogspot.co.uk", "blogspot.co.uk"}, {"blogspot.nic.uk", "uk"}, {"blogspot.sch.uk", "blogspot.sch.uk"}, // The .рф rules are // рф (xn--p1ai) {"xn--p1ai", "xn--p1ai"}, {"aaa.xn--p1ai", "xn--p1ai"}, {"www.xxx.yyy.xn--p1ai", "xn--p1ai"}, // The .zw rules are: // *.zw {"zw", "zw"}, {"www.zw", "www.zw"}, {"zzz.zw", "zzz.zw"}, {"www.zzz.zw", "zzz.zw"}, {"www.xxx.yyy.zzz.zw", "zzz.zw"}, // There are no .nosuchtld rules. {"nosuchtld", "nosuchtld"}, {"foo.nosuchtld", "nosuchtld"}, {"bar.foo.nosuchtld", "nosuchtld"}, } func BenchmarkPublicSuffix(b *testing.B) { for i := 0; i < b.N; i++ { for _, tc := range publicSuffixTestCases { List.PublicSuffix(tc.domain) } } } func TestPublicSuffix(t *testing.T) { for _, tc := range publicSuffixTestCases { got := List.PublicSuffix(tc.domain) if got != tc.want { t.Errorf("%q: got %q, want %q", tc.domain, got, tc.want) } } } func TestSlowPublicSuffix(t *testing.T) { for _, tc := range publicSuffixTestCases { got := slowPublicSuffix(tc.domain) if got != tc.want { t.Errorf("%q: got %q, want %q", tc.domain, got, tc.want) } } } // slowPublicSuffix implements the canonical (but O(number of rules)) public // suffix algorithm described at http://publicsuffix.org/list/. // // 1. Match domain against all rules and take note of the matching ones. // 2. If no rules match, the prevailing rule is "*". // 3. If more than one rule matches, the prevailing rule is the one which is an exception rule. // 4. If there is no matching exception rule, the prevailing rule is the one with the most labels. // 5. If the prevailing rule is a exception rule, modify it by removing the leftmost label. // 6. The public suffix is the set of labels from the domain which directly match the labels of the prevailing rule (joined by dots). // 7. The registered or registrable domain is the public suffix plus one additional label. // // This function returns the public suffix, not the registrable domain, and so // it stops after step 6. func slowPublicSuffix(domain string) string { match := func(rulePart, domainPart string) bool { switch rulePart[0] { case '*': return true case '!': return rulePart[1:] == domainPart } return rulePart == domainPart } domainParts := strings.Split(domain, ".") var matchingRules [][]string loop: for _, rule := range rules { ruleParts := strings.Split(rule, ".") if len(domainParts) < len(ruleParts) { continue } for i := range ruleParts { rulePart := ruleParts[len(ruleParts)-1-i] domainPart := domainParts[len(domainParts)-1-i] if !match(rulePart, domainPart) { continue loop } } matchingRules = append(matchingRules, ruleParts) } if len(matchingRules) == 0 { matchingRules = append(matchingRules, []string{"*"}) } else { sort.Sort(byPriority(matchingRules)) } prevailing := matchingRules[0] if prevailing[0][0] == '!' { prevailing = prevailing[1:] } if prevailing[0][0] == '*' { replaced := domainParts[len(domainParts)-len(prevailing)] prevailing = append([]string{replaced}, prevailing[1:]...) } return strings.Join(prevailing, ".") } type byPriority [][]string func (b byPriority) Len() int { return len(b) } func (b byPriority) Swap(i, j int) { b[i], b[j] = b[j], b[i] } func (b byPriority) Less(i, j int) bool { if b[i][0][0] == '!' { return true } if b[j][0][0] == '!' { return false } return len(b[i]) > len(b[j]) } // eTLDPlusOneTestCases come from // http://mxr.mozilla.org/mozilla-central/source/netwerk/test/unit/data/test_psl.txt var eTLDPlusOneTestCases = []struct { domain, want string }{ // Empty input. {"", ""}, // Unlisted TLD. {"example", ""}, {"example.example", "example.example"}, {"b.example.example", "example.example"}, {"a.b.example.example", "example.example"}, // TLD with only 1 rule. {"biz", ""}, {"domain.biz", "domain.biz"}, {"b.domain.biz", "domain.biz"}, {"a.b.domain.biz", "domain.biz"}, // TLD with some 2-level rules. {"com", ""}, {"example.com", "example.com"}, {"b.example.com", "example.com"}, {"a.b.example.com", "example.com"}, {"uk.com", ""}, {"example.uk.com", "example.uk.com"}, {"b.example.uk.com", "example.uk.com"}, {"a.b.example.uk.com", "example.uk.com"}, {"test.ac", "test.ac"}, // TLD with only 1 (wildcard) rule. {"cy", ""}, {"c.cy", ""}, {"b.c.cy", "b.c.cy"}, {"a.b.c.cy", "b.c.cy"}, // More complex TLD. {"jp", ""}, {"test.jp", "test.jp"}, {"www.test.jp", "test.jp"}, {"ac.jp", ""}, {"test.ac.jp", "test.ac.jp"}, {"www.test.ac.jp", "test.ac.jp"}, {"kyoto.jp", ""}, {"test.kyoto.jp", "test.kyoto.jp"}, {"ide.kyoto.jp", ""}, {"b.ide.kyoto.jp", "b.ide.kyoto.jp"}, {"a.b.ide.kyoto.jp", "b.ide.kyoto.jp"}, {"c.kobe.jp", ""}, {"b.c.kobe.jp", "b.c.kobe.jp"}, {"a.b.c.kobe.jp", "b.c.kobe.jp"}, {"city.kobe.jp", "city.kobe.jp"}, {"www.city.kobe.jp", "city.kobe.jp"}, // TLD with a wildcard rule and exceptions. {"ck", ""}, {"test.ck", ""}, {"b.test.ck", "b.test.ck"}, {"a.b.test.ck", "b.test.ck"}, {"www.ck", "www.ck"}, {"www.www.ck", "www.ck"}, // US K12. {"us", ""}, {"test.us", "test.us"}, {"www.test.us", "test.us"}, {"ak.us", ""}, {"test.ak.us", "test.ak.us"}, {"www.test.ak.us", "test.ak.us"}, {"k12.ak.us", ""}, {"test.k12.ak.us", "test.k12.ak.us"}, {"www.test.k12.ak.us", "test.k12.ak.us"}, } func TestEffectiveTLDPlusOne(t *testing.T) { for _, tc := range eTLDPlusOneTestCases { got, _ := EffectiveTLDPlusOne(tc.domain) if got != tc.want { t.Errorf("%q: got %q, want %q", tc.domain, got, tc.want) } } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/publicsuffix/table_test.go�������������������������������������������������������������������0000644�0001751�0001751�00000521720�12235217213�016511� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// generated by go run gen.go; DO NOT EDIT package publicsuffix var rules = [...]string{ "ac", "com.ac", "edu.ac", "gov.ac", "net.ac", "mil.ac", "org.ac", "ad", "nom.ad", "ae", "co.ae", "net.ae", "org.ae", "sch.ae", "ac.ae", "gov.ae", "mil.ae", "aero", "accident-investigation.aero", "accident-prevention.aero", "aerobatic.aero", "aeroclub.aero", "aerodrome.aero", "agents.aero", "aircraft.aero", "airline.aero", "airport.aero", "air-surveillance.aero", "airtraffic.aero", "air-traffic-control.aero", "ambulance.aero", "amusement.aero", "association.aero", "author.aero", "ballooning.aero", "broker.aero", "caa.aero", "cargo.aero", "catering.aero", "certification.aero", "championship.aero", "charter.aero", "civilaviation.aero", "club.aero", "conference.aero", "consultant.aero", "consulting.aero", "control.aero", "council.aero", "crew.aero", "design.aero", "dgca.aero", "educator.aero", "emergency.aero", "engine.aero", "engineer.aero", "entertainment.aero", "equipment.aero", "exchange.aero", "express.aero", "federation.aero", "flight.aero", "freight.aero", "fuel.aero", "gliding.aero", "government.aero", "groundhandling.aero", "group.aero", "hanggliding.aero", "homebuilt.aero", "insurance.aero", "journal.aero", "journalist.aero", "leasing.aero", "logistics.aero", "magazine.aero", "maintenance.aero", "marketplace.aero", "media.aero", "microlight.aero", "modelling.aero", "navigation.aero", "parachuting.aero", "paragliding.aero", "passenger-association.aero", "pilot.aero", "press.aero", "production.aero", "recreation.aero", "repbody.aero", "res.aero", "research.aero", "rotorcraft.aero", "safety.aero", "scientist.aero", "services.aero", "show.aero", "skydiving.aero", "software.aero", "student.aero", "taxi.aero", "trader.aero", "trading.aero", "trainer.aero", "union.aero", "workinggroup.aero", "works.aero", "af", "gov.af", "com.af", "org.af", "net.af", "edu.af", "ag", "com.ag", "org.ag", "net.ag", "co.ag", "nom.ag", "ai", "off.ai", "com.ai", "net.ai", "org.ai", "al", "com.al", "edu.al", "gov.al", "mil.al", "net.al", "org.al", "am", "an", "com.an", "net.an", "org.an", "edu.an", "ao", "ed.ao", "gv.ao", "og.ao", "co.ao", "pb.ao", "it.ao", "aq", "ar", "com.ar", "edu.ar", "gob.ar", "int.ar", "mil.ar", "net.ar", "org.ar", "tur.ar", "e164.arpa", "in-addr.arpa", "ip6.arpa", "iris.arpa", "uri.arpa", "urn.arpa", "as", "gov.as", "asia", "at", "ac.at", "co.at", "gv.at", "or.at", "com.au", "net.au", "org.au", "edu.au", "gov.au", "asn.au", "id.au", "csiro.au", "info.au", "conf.au", "oz.au", "act.au", "nsw.au", "nt.au", "qld.au", "sa.au", "tas.au", "vic.au", "wa.au", "act.edu.au", "nsw.edu.au", "nt.edu.au", "qld.edu.au", "sa.edu.au", "tas.edu.au", "vic.edu.au", "wa.edu.au", "act.gov.au", "nt.gov.au", "qld.gov.au", "sa.gov.au", "tas.gov.au", "vic.gov.au", "wa.gov.au", "aw", "com.aw", "ax", "az", "com.az", "net.az", "int.az", "gov.az", "org.az", "edu.az", "info.az", "pp.az", "mil.az", "name.az", "pro.az", "biz.az", "ba", "org.ba", "net.ba", "edu.ba", "gov.ba", "mil.ba", "unsa.ba", "unbi.ba", "co.ba", "com.ba", "rs.ba", "bb", "biz.bb", "com.bb", "edu.bb", "gov.bb", "info.bb", "net.bb", "org.bb", "store.bb", "*.bd", "be", "ac.be", "bf", "gov.bf", "bg", "a.bg", "b.bg", "c.bg", "d.bg", "e.bg", "f.bg", "g.bg", "h.bg", "i.bg", "j.bg", "k.bg", "l.bg", "m.bg", "n.bg", "o.bg", "p.bg", "q.bg", "r.bg", "s.bg", "t.bg", "u.bg", "v.bg", "w.bg", "x.bg", "y.bg", "z.bg", "0.bg", "1.bg", "2.bg", "3.bg", "4.bg", "5.bg", "6.bg", "7.bg", "8.bg", "9.bg", "bh", "com.bh", "edu.bh", "net.bh", "org.bh", "gov.bh", "bi", "co.bi", "com.bi", "edu.bi", "or.bi", "org.bi", "biz", "bj", "asso.bj", "barreau.bj", "gouv.bj", "bm", "com.bm", "edu.bm", "gov.bm", "net.bm", "org.bm", "*.bn", "bo", "com.bo", "edu.bo", "gov.bo", "gob.bo", "int.bo", "org.bo", "net.bo", "mil.bo", "tv.bo", "br", "adm.br", "adv.br", "agr.br", "am.br", "arq.br", "art.br", "ato.br", "b.br", "bio.br", "blog.br", "bmd.br", "cim.br", "cng.br", "cnt.br", "com.br", "coop.br", "ecn.br", "eco.br", "edu.br", "emp.br", "eng.br", "esp.br", "etc.br", "eti.br", "far.br", "flog.br", "fm.br", "fnd.br", "fot.br", "fst.br", "g12.br", "ggf.br", "gov.br", "imb.br", "ind.br", "inf.br", "jor.br", "jus.br", "leg.br", "lel.br", "mat.br", "med.br", "mil.br", "mus.br", "net.br", "nom.br", "not.br", "ntr.br", "odo.br", "org.br", "ppg.br", "pro.br", "psc.br", "psi.br", "qsl.br", "radio.br", "rec.br", "slg.br", "srv.br", "taxi.br", "teo.br", "tmp.br", "trd.br", "tur.br", "tv.br", "vet.br", "vlog.br", "wiki.br", "zlg.br", "bs", "com.bs", "net.bs", "org.bs", "edu.bs", "gov.bs", "bt", "com.bt", "edu.bt", "gov.bt", "net.bt", "org.bt", "bw", "co.bw", "org.bw", "by", "gov.by", "mil.by", "com.by", "of.by", "bz", "com.bz", "net.bz", "org.bz", "edu.bz", "gov.bz", "ca", "ab.ca", "bc.ca", "mb.ca", "nb.ca", "nf.ca", "nl.ca", "ns.ca", "nt.ca", "nu.ca", "on.ca", "pe.ca", "qc.ca", "sk.ca", "yk.ca", "gc.ca", "cat", "cc", "cd", "gov.cd", "cf", "cg", "ch", "ci", "org.ci", "or.ci", "com.ci", "co.ci", "edu.ci", "ed.ci", "ac.ci", "net.ci", "go.ci", "asso.ci", "xn--aroport-bya.ci", "int.ci", "presse.ci", "md.ci", "gouv.ci", "*.ck", "!www.ck", "cl", "gov.cl", "gob.cl", "co.cl", "mil.cl", "cm", "gov.cm", "cn", "ac.cn", "com.cn", "edu.cn", "gov.cn", "net.cn", "org.cn", "mil.cn", "xn--55qx5d.cn", "xn--io0a7i.cn", "xn--od0alg.cn", "ah.cn", "bj.cn", "cq.cn", "fj.cn", "gd.cn", "gs.cn", "gz.cn", "gx.cn", "ha.cn", "hb.cn", "he.cn", "hi.cn", "hl.cn", "hn.cn", "jl.cn", "js.cn", "jx.cn", "ln.cn", "nm.cn", "nx.cn", "qh.cn", "sc.cn", "sd.cn", "sh.cn", "sn.cn", "sx.cn", "tj.cn", "xj.cn", "xz.cn", "yn.cn", "zj.cn", "hk.cn", "mo.cn", "tw.cn", "co", "arts.co", "com.co", "edu.co", "firm.co", "gov.co", "info.co", "int.co", "mil.co", "net.co", "nom.co", "org.co", "rec.co", "web.co", "com", "coop", "cr", "ac.cr", "co.cr", "ed.cr", "fi.cr", "go.cr", "or.cr", "sa.cr", "cu", "com.cu", "edu.cu", "org.cu", "net.cu", "gov.cu", "inf.cu", "cv", "cw", "com.cw", "edu.cw", "net.cw", "org.cw", "cx", "gov.cx", "*.cy", "cz", "de", "dj", "dk", "dm", "com.dm", "net.dm", "org.dm", "edu.dm", "gov.dm", "do", "art.do", "com.do", "edu.do", "gob.do", "gov.do", "mil.do", "net.do", "org.do", "sld.do", "web.do", "dz", "com.dz", "org.dz", "net.dz", "gov.dz", "edu.dz", "asso.dz", "pol.dz", "art.dz", "ec", "com.ec", "info.ec", "net.ec", "fin.ec", "k12.ec", "med.ec", "pro.ec", "org.ec", "edu.ec", "gov.ec", "gob.ec", "mil.ec", "edu", "ee", "edu.ee", "gov.ee", "riik.ee", "lib.ee", "med.ee", "com.ee", "pri.ee", "aip.ee", "org.ee", "fie.ee", "eg", "com.eg", "edu.eg", "eun.eg", "gov.eg", "mil.eg", "name.eg", "net.eg", "org.eg", "sci.eg", "*.er", "es", "com.es", "nom.es", "org.es", "gob.es", "edu.es", "*.et", "eu", "fi", "aland.fi", "*.fj", "*.fk", "fm", "fo", "fr", "com.fr", "asso.fr", "nom.fr", "prd.fr", "presse.fr", "tm.fr", "aeroport.fr", "assedic.fr", "avocat.fr", "avoues.fr", "cci.fr", "chambagri.fr", "chirurgiens-dentistes.fr", "experts-comptables.fr", "geometre-expert.fr", "gouv.fr", "greta.fr", "huissier-justice.fr", "medecin.fr", "notaires.fr", "pharmacien.fr", "port.fr", "veterinaire.fr", "ga", "gd", "ge", "com.ge", "edu.ge", "gov.ge", "org.ge", "mil.ge", "net.ge", "pvt.ge", "gf", "gg", "co.gg", "org.gg", "net.gg", "sch.gg", "gov.gg", "gh", "com.gh", "edu.gh", "gov.gh", "org.gh", "mil.gh", "gi", "com.gi", "ltd.gi", "gov.gi", "mod.gi", "edu.gi", "org.gi", "gl", "gm", "ac.gn", "com.gn", "edu.gn", "gov.gn", "org.gn", "net.gn", "gov", "gp", "com.gp", "net.gp", "mobi.gp", "edu.gp", "org.gp", "asso.gp", "gq", "gr", "com.gr", "edu.gr", "net.gr", "org.gr", "gov.gr", "gs", "gt", "com.gt", "edu.gt", "gob.gt", "ind.gt", "mil.gt", "net.gt", "org.gt", "*.gu", "gw", "gy", "co.gy", "com.gy", "net.gy", "hk", "com.hk", "edu.hk", "gov.hk", "idv.hk", "net.hk", "org.hk", "xn--55qx5d.hk", "xn--wcvs22d.hk", "xn--lcvr32d.hk", "xn--mxtq1m.hk", "xn--gmqw5a.hk", "xn--ciqpn.hk", "xn--gmq050i.hk", "xn--zf0avx.hk", "xn--io0a7i.hk", "xn--mk0axi.hk", "xn--od0alg.hk", "xn--od0aq3b.hk", "xn--tn0ag.hk", "xn--uc0atv.hk", "xn--uc0ay4a.hk", "hm", "hn", "com.hn", "edu.hn", "org.hn", "net.hn", "mil.hn", "gob.hn", "hr", "iz.hr", "from.hr", "name.hr", "com.hr", "ht", "com.ht", "shop.ht", "firm.ht", "info.ht", "adult.ht", "net.ht", "pro.ht", "org.ht", "med.ht", "art.ht", "coop.ht", "pol.ht", "asso.ht", "edu.ht", "rel.ht", "gouv.ht", "perso.ht", "hu", "co.hu", "info.hu", "org.hu", "priv.hu", "sport.hu", "tm.hu", "2000.hu", "agrar.hu", "bolt.hu", "casino.hu", "city.hu", "erotica.hu", "erotika.hu", "film.hu", "forum.hu", "games.hu", "hotel.hu", "ingatlan.hu", "jogasz.hu", "konyvelo.hu", "lakas.hu", "media.hu", "news.hu", "reklam.hu", "sex.hu", "shop.hu", "suli.hu", "szex.hu", "tozsde.hu", "utazas.hu", "video.hu", "id", "ac.id", "biz.id", "co.id", "go.id", "mil.id", "my.id", "net.id", "or.id", "sch.id", "web.id", "ie", "gov.ie", "*.il", "im", "co.im", "ltd.co.im", "plc.co.im", "net.im", "gov.im", "org.im", "nic.im", "ac.im", "in", "co.in", "firm.in", "net.in", "org.in", "gen.in", "ind.in", "nic.in", "ac.in", "edu.in", "res.in", "gov.in", "mil.in", "info", "int", "eu.int", "io", "com.io", "iq", "gov.iq", "edu.iq", "mil.iq", "com.iq", "org.iq", "net.iq", "ir", "ac.ir", "co.ir", "gov.ir", "id.ir", "net.ir", "org.ir", "sch.ir", "xn--mgba3a4f16a.ir", "xn--mgba3a4fra.ir", "is", "net.is", "com.is", "edu.is", "gov.is", "org.is", "int.is", "it", "gov.it", "edu.it", "agrigento.it", "ag.it", "alessandria.it", "al.it", "ancona.it", "an.it", "aosta.it", "aoste.it", "ao.it", "arezzo.it", "ar.it", "ascoli-piceno.it", "ascolipiceno.it", "ap.it", "asti.it", "at.it", "avellino.it", "av.it", "bari.it", "ba.it", "andria-barletta-trani.it", "andriabarlettatrani.it", "trani-barletta-andria.it", "tranibarlettaandria.it", "barletta-trani-andria.it", "barlettatraniandria.it", "andria-trani-barletta.it", "andriatranibarletta.it", "trani-andria-barletta.it", "traniandriabarletta.it", "bt.it", "belluno.it", "bl.it", "benevento.it", "bn.it", "bergamo.it", "bg.it", "biella.it", "bi.it", "bologna.it", "bo.it", "bolzano.it", "bozen.it", "balsan.it", "alto-adige.it", "altoadige.it", "suedtirol.it", "bz.it", "brescia.it", "bs.it", "brindisi.it", "br.it", "cagliari.it", "ca.it", "caltanissetta.it", "cl.it", "campobasso.it", "cb.it", "carboniaiglesias.it", "carbonia-iglesias.it", "iglesias-carbonia.it", "iglesiascarbonia.it", "ci.it", "caserta.it", "ce.it", "catania.it", "ct.it", "catanzaro.it", "cz.it", "chieti.it", "ch.it", "como.it", "co.it", "cosenza.it", "cs.it", "cremona.it", "cr.it", "crotone.it", "kr.it", "cuneo.it", "cn.it", "dell-ogliastra.it", "dellogliastra.it", "ogliastra.it", "og.it", "enna.it", "en.it", "ferrara.it", "fe.it", "fermo.it", "fm.it", "firenze.it", "florence.it", "fi.it", "foggia.it", "fg.it", "forli-cesena.it", "forlicesena.it", "cesena-forli.it", "cesenaforli.it", "fc.it", "frosinone.it", "fr.it", "genova.it", "genoa.it", "ge.it", "gorizia.it", "go.it", "grosseto.it", "gr.it", "imperia.it", "im.it", "isernia.it", "is.it", "laquila.it", "aquila.it", "aq.it", "la-spezia.it", "laspezia.it", "sp.it", "latina.it", "lt.it", "lecce.it", "le.it", "lecco.it", "lc.it", "livorno.it", "li.it", "lodi.it", "lo.it", "lucca.it", "lu.it", "macerata.it", "mc.it", "mantova.it", "mn.it", "massa-carrara.it", "massacarrara.it", "carrara-massa.it", "carraramassa.it", "ms.it", "matera.it", "mt.it", "medio-campidano.it", "mediocampidano.it", "campidano-medio.it", "campidanomedio.it", "vs.it", "messina.it", "me.it", "milano.it", "milan.it", "mi.it", "modena.it", "mo.it", "monza.it", "monza-brianza.it", "monzabrianza.it", "monzaebrianza.it", "monzaedellabrianza.it", "monza-e-della-brianza.it", "mb.it", "napoli.it", "naples.it", "na.it", "novara.it", "no.it", "nuoro.it", "nu.it", "oristano.it", "or.it", "padova.it", "padua.it", "pd.it", "palermo.it", "pa.it", "parma.it", "pr.it", "pavia.it", "pv.it", "perugia.it", "pg.it", "pescara.it", "pe.it", "pesaro-urbino.it", "pesarourbino.it", "urbino-pesaro.it", "urbinopesaro.it", "pu.it", "piacenza.it", "pc.it", "pisa.it", "pi.it", "pistoia.it", "pt.it", "pordenone.it", "pn.it", "potenza.it", "pz.it", "prato.it", "po.it", "ragusa.it", "rg.it", "ravenna.it", "ra.it", "reggio-calabria.it", "reggiocalabria.it", "rc.it", "reggio-emilia.it", "reggioemilia.it", "re.it", "rieti.it", "ri.it", "rimini.it", "rn.it", "roma.it", "rome.it", "rm.it", "rovigo.it", "ro.it", "salerno.it", "sa.it", "sassari.it", "ss.it", "savona.it", "sv.it", "siena.it", "si.it", "siracusa.it", "sr.it", "sondrio.it", "so.it", "taranto.it", "ta.it", "tempio-olbia.it", "tempioolbia.it", "olbia-tempio.it", "olbiatempio.it", "ot.it", "teramo.it", "te.it", "terni.it", "tr.it", "torino.it", "turin.it", "to.it", "trapani.it", "tp.it", "trento.it", "trentino.it", "tn.it", "treviso.it", "tv.it", "trieste.it", "ts.it", "udine.it", "ud.it", "varese.it", "va.it", "venezia.it", "venice.it", "ve.it", "verbania.it", "vb.it", "vercelli.it", "vc.it", "verona.it", "vr.it", "vibo-valentia.it", "vibovalentia.it", "vv.it", "vicenza.it", "vi.it", "viterbo.it", "vt.it", "je", "co.je", "org.je", "net.je", "sch.je", "gov.je", "*.jm", "jo", "com.jo", "org.jo", "net.jo", "edu.jo", "sch.jo", "gov.jo", "mil.jo", "name.jo", "jobs", "jp", "ac.jp", "ad.jp", "co.jp", "ed.jp", "go.jp", "gr.jp", "lg.jp", "ne.jp", "or.jp", "aichi.jp", "akita.jp", "aomori.jp", "chiba.jp", "ehime.jp", "fukui.jp", "fukuoka.jp", "fukushima.jp", "gifu.jp", "gunma.jp", "hiroshima.jp", "hokkaido.jp", "hyogo.jp", "ibaraki.jp", "ishikawa.jp", "iwate.jp", "kagawa.jp", "kagoshima.jp", "kanagawa.jp", "kochi.jp", "kumamoto.jp", "kyoto.jp", "mie.jp", "miyagi.jp", "miyazaki.jp", "nagano.jp", "nagasaki.jp", "nara.jp", "niigata.jp", "oita.jp", "okayama.jp", "okinawa.jp", "osaka.jp", "saga.jp", "saitama.jp", "shiga.jp", "shimane.jp", "shizuoka.jp", "tochigi.jp", "tokushima.jp", "tokyo.jp", "tottori.jp", "toyama.jp", "wakayama.jp", "yamagata.jp", "yamaguchi.jp", "yamanashi.jp", "*.kawasaki.jp", "*.kitakyushu.jp", "*.kobe.jp", "*.nagoya.jp", "*.sapporo.jp", "*.sendai.jp", "*.yokohama.jp", "!city.kawasaki.jp", "!city.kitakyushu.jp", "!city.kobe.jp", "!city.nagoya.jp", "!city.sapporo.jp", "!city.sendai.jp", "!city.yokohama.jp", "aisai.aichi.jp", "ama.aichi.jp", "anjo.aichi.jp", "asuke.aichi.jp", "chiryu.aichi.jp", "chita.aichi.jp", "fuso.aichi.jp", "gamagori.aichi.jp", "handa.aichi.jp", "hazu.aichi.jp", "hekinan.aichi.jp", "higashiura.aichi.jp", "ichinomiya.aichi.jp", "inazawa.aichi.jp", "inuyama.aichi.jp", "isshiki.aichi.jp", "iwakura.aichi.jp", "kanie.aichi.jp", "kariya.aichi.jp", "kasugai.aichi.jp", "kira.aichi.jp", "kiyosu.aichi.jp", "komaki.aichi.jp", "konan.aichi.jp", "kota.aichi.jp", "mihama.aichi.jp", "miyoshi.aichi.jp", "nagakute.aichi.jp", "nishio.aichi.jp", "nisshin.aichi.jp", "obu.aichi.jp", "oguchi.aichi.jp", "oharu.aichi.jp", "okazaki.aichi.jp", "owariasahi.aichi.jp", "seto.aichi.jp", "shikatsu.aichi.jp", "shinshiro.aichi.jp", "shitara.aichi.jp", "tahara.aichi.jp", "takahama.aichi.jp", "tobishima.aichi.jp", "toei.aichi.jp", "togo.aichi.jp", "tokai.aichi.jp", "tokoname.aichi.jp", "toyoake.aichi.jp", "toyohashi.aichi.jp", "toyokawa.aichi.jp", "toyone.aichi.jp", "toyota.aichi.jp", "tsushima.aichi.jp", "yatomi.aichi.jp", "akita.akita.jp", "daisen.akita.jp", "fujisato.akita.jp", "gojome.akita.jp", "hachirogata.akita.jp", "happou.akita.jp", "higashinaruse.akita.jp", "honjo.akita.jp", "honjyo.akita.jp", "ikawa.akita.jp", "kamikoani.akita.jp", "kamioka.akita.jp", "katagami.akita.jp", "kazuno.akita.jp", "kitaakita.akita.jp", "kosaka.akita.jp", "kyowa.akita.jp", "misato.akita.jp", "mitane.akita.jp", "moriyoshi.akita.jp", "nikaho.akita.jp", "noshiro.akita.jp", "odate.akita.jp", "oga.akita.jp", "ogata.akita.jp", "semboku.akita.jp", "yokote.akita.jp", "yurihonjo.akita.jp", "aomori.aomori.jp", "gonohe.aomori.jp", "hachinohe.aomori.jp", "hashikami.aomori.jp", "hiranai.aomori.jp", "hirosaki.aomori.jp", "itayanagi.aomori.jp", "kuroishi.aomori.jp", "misawa.aomori.jp", "mutsu.aomori.jp", "nakadomari.aomori.jp", "noheji.aomori.jp", "oirase.aomori.jp", "owani.aomori.jp", "rokunohe.aomori.jp", "sannohe.aomori.jp", "shichinohe.aomori.jp", "shingo.aomori.jp", "takko.aomori.jp", "towada.aomori.jp", "tsugaru.aomori.jp", "tsuruta.aomori.jp", "abiko.chiba.jp", "asahi.chiba.jp", "chonan.chiba.jp", "chosei.chiba.jp", "choshi.chiba.jp", "chuo.chiba.jp", "funabashi.chiba.jp", "futtsu.chiba.jp", "hanamigawa.chiba.jp", "ichihara.chiba.jp", "ichikawa.chiba.jp", "ichinomiya.chiba.jp", "inzai.chiba.jp", "isumi.chiba.jp", "kamagaya.chiba.jp", "kamogawa.chiba.jp", "kashiwa.chiba.jp", "katori.chiba.jp", "katsuura.chiba.jp", "kimitsu.chiba.jp", "kisarazu.chiba.jp", "kozaki.chiba.jp", "kujukuri.chiba.jp", "kyonan.chiba.jp", "matsudo.chiba.jp", "midori.chiba.jp", "mihama.chiba.jp", "minamiboso.chiba.jp", "mobara.chiba.jp", "mutsuzawa.chiba.jp", "nagara.chiba.jp", "nagareyama.chiba.jp", "narashino.chiba.jp", "narita.chiba.jp", "noda.chiba.jp", "oamishirasato.chiba.jp", "omigawa.chiba.jp", "onjuku.chiba.jp", "otaki.chiba.jp", "sakae.chiba.jp", "sakura.chiba.jp", "shimofusa.chiba.jp", "shirako.chiba.jp", "shiroi.chiba.jp", "shisui.chiba.jp", "sodegaura.chiba.jp", "sosa.chiba.jp", "tako.chiba.jp", "tateyama.chiba.jp", "togane.chiba.jp", "tohnosho.chiba.jp", "tomisato.chiba.jp", "urayasu.chiba.jp", "yachimata.chiba.jp", "yachiyo.chiba.jp", "yokaichiba.chiba.jp", "yokoshibahikari.chiba.jp", "yotsukaido.chiba.jp", "ainan.ehime.jp", "honai.ehime.jp", "ikata.ehime.jp", "imabari.ehime.jp", "iyo.ehime.jp", "kamijima.ehime.jp", "kihoku.ehime.jp", "kumakogen.ehime.jp", "masaki.ehime.jp", "matsuno.ehime.jp", "matsuyama.ehime.jp", "namikata.ehime.jp", "niihama.ehime.jp", "ozu.ehime.jp", "saijo.ehime.jp", "seiyo.ehime.jp", "shikokuchuo.ehime.jp", "tobe.ehime.jp", "toon.ehime.jp", "uchiko.ehime.jp", "uwajima.ehime.jp", "yawatahama.ehime.jp", "echizen.fukui.jp", "eiheiji.fukui.jp", "fukui.fukui.jp", "ikeda.fukui.jp", "katsuyama.fukui.jp", "mihama.fukui.jp", "minamiechizen.fukui.jp", "obama.fukui.jp", "ohi.fukui.jp", "ono.fukui.jp", "sabae.fukui.jp", "sakai.fukui.jp", "takahama.fukui.jp", "tsuruga.fukui.jp", "wakasa.fukui.jp", "ashiya.fukuoka.jp", "buzen.fukuoka.jp", "chikugo.fukuoka.jp", "chikuho.fukuoka.jp", "chikujo.fukuoka.jp", "chikushino.fukuoka.jp", "chikuzen.fukuoka.jp", "chuo.fukuoka.jp", "dazaifu.fukuoka.jp", "fukuchi.fukuoka.jp", "hakata.fukuoka.jp", "higashi.fukuoka.jp", "hirokawa.fukuoka.jp", "hisayama.fukuoka.jp", "iizuka.fukuoka.jp", "inatsuki.fukuoka.jp", "kaho.fukuoka.jp", "kasuga.fukuoka.jp", "kasuya.fukuoka.jp", "kawara.fukuoka.jp", "keisen.fukuoka.jp", "koga.fukuoka.jp", "kurate.fukuoka.jp", "kurogi.fukuoka.jp", "kurume.fukuoka.jp", "minami.fukuoka.jp", "miyako.fukuoka.jp", "miyama.fukuoka.jp", "miyawaka.fukuoka.jp", "mizumaki.fukuoka.jp", "munakata.fukuoka.jp", "nakagawa.fukuoka.jp", "nakama.fukuoka.jp", "nishi.fukuoka.jp", "nogata.fukuoka.jp", "ogori.fukuoka.jp", "okagaki.fukuoka.jp", "okawa.fukuoka.jp", "oki.fukuoka.jp", "omuta.fukuoka.jp", "onga.fukuoka.jp", "onojo.fukuoka.jp", "oto.fukuoka.jp", "saigawa.fukuoka.jp", "sasaguri.fukuoka.jp", "shingu.fukuoka.jp", "shinyoshitomi.fukuoka.jp", "shonai.fukuoka.jp", "soeda.fukuoka.jp", "sue.fukuoka.jp", "tachiarai.fukuoka.jp", "tagawa.fukuoka.jp", "takata.fukuoka.jp", "toho.fukuoka.jp", "toyotsu.fukuoka.jp", "tsuiki.fukuoka.jp", "ukiha.fukuoka.jp", "umi.fukuoka.jp", "usui.fukuoka.jp", "yamada.fukuoka.jp", "yame.fukuoka.jp", "yanagawa.fukuoka.jp", "yukuhashi.fukuoka.jp", "aizubange.fukushima.jp", "aizumisato.fukushima.jp", "aizuwakamatsu.fukushima.jp", "asakawa.fukushima.jp", "bandai.fukushima.jp", "date.fukushima.jp", "fukushima.fukushima.jp", "furudono.fukushima.jp", "futaba.fukushima.jp", "hanawa.fukushima.jp", "higashi.fukushima.jp", "hirata.fukushima.jp", "hirono.fukushima.jp", "iitate.fukushima.jp", "inawashiro.fukushima.jp", "ishikawa.fukushima.jp", "iwaki.fukushima.jp", "izumizaki.fukushima.jp", "kagamiishi.fukushima.jp", "kaneyama.fukushima.jp", "kawamata.fukushima.jp", "kitakata.fukushima.jp", "kitashiobara.fukushima.jp", "koori.fukushima.jp", "koriyama.fukushima.jp", "kunimi.fukushima.jp", "miharu.fukushima.jp", "mishima.fukushima.jp", "namie.fukushima.jp", "nango.fukushima.jp", "nishiaizu.fukushima.jp", "nishigo.fukushima.jp", "okuma.fukushima.jp", "omotego.fukushima.jp", "ono.fukushima.jp", "otama.fukushima.jp", "samegawa.fukushima.jp", "shimogo.fukushima.jp", "shirakawa.fukushima.jp", "showa.fukushima.jp", "soma.fukushima.jp", "sukagawa.fukushima.jp", "taishin.fukushima.jp", "tamakawa.fukushima.jp", "tanagura.fukushima.jp", "tenei.fukushima.jp", "yabuki.fukushima.jp", "yamato.fukushima.jp", "yamatsuri.fukushima.jp", "yanaizu.fukushima.jp", "yugawa.fukushima.jp", "anpachi.gifu.jp", "ena.gifu.jp", "gifu.gifu.jp", "ginan.gifu.jp", "godo.gifu.jp", "gujo.gifu.jp", "hashima.gifu.jp", "hichiso.gifu.jp", "hida.gifu.jp", "higashishirakawa.gifu.jp", "ibigawa.gifu.jp", "ikeda.gifu.jp", "kakamigahara.gifu.jp", "kani.gifu.jp", "kasahara.gifu.jp", "kasamatsu.gifu.jp", "kawaue.gifu.jp", "kitagata.gifu.jp", "mino.gifu.jp", "minokamo.gifu.jp", "mitake.gifu.jp", "mizunami.gifu.jp", "motosu.gifu.jp", "nakatsugawa.gifu.jp", "ogaki.gifu.jp", "sakahogi.gifu.jp", "seki.gifu.jp", "sekigahara.gifu.jp", "shirakawa.gifu.jp", "tajimi.gifu.jp", "takayama.gifu.jp", "tarui.gifu.jp", "toki.gifu.jp", "tomika.gifu.jp", "wanouchi.gifu.jp", "yamagata.gifu.jp", "yaotsu.gifu.jp", "yoro.gifu.jp", "annaka.gunma.jp", "chiyoda.gunma.jp", "fujioka.gunma.jp", "higashiagatsuma.gunma.jp", "isesaki.gunma.jp", "itakura.gunma.jp", "kanna.gunma.jp", "kanra.gunma.jp", "katashina.gunma.jp", "kawaba.gunma.jp", "kiryu.gunma.jp", "kusatsu.gunma.jp", "maebashi.gunma.jp", "meiwa.gunma.jp", "midori.gunma.jp", "minakami.gunma.jp", "naganohara.gunma.jp", "nakanojo.gunma.jp", "nanmoku.gunma.jp", "numata.gunma.jp", "oizumi.gunma.jp", "ora.gunma.jp", "ota.gunma.jp", "shibukawa.gunma.jp", "shimonita.gunma.jp", "shinto.gunma.jp", "showa.gunma.jp", "takasaki.gunma.jp", "takayama.gunma.jp", "tamamura.gunma.jp", "tatebayashi.gunma.jp", "tomioka.gunma.jp", "tsukiyono.gunma.jp", "tsumagoi.gunma.jp", "ueno.gunma.jp", "yoshioka.gunma.jp", "asaminami.hiroshima.jp", "daiwa.hiroshima.jp", "etajima.hiroshima.jp", "fuchu.hiroshima.jp", "fukuyama.hiroshima.jp", "hatsukaichi.hiroshima.jp", "higashihiroshima.hiroshima.jp", "hongo.hiroshima.jp", "jinsekikogen.hiroshima.jp", "kaita.hiroshima.jp", "kui.hiroshima.jp", "kumano.hiroshima.jp", "kure.hiroshima.jp", "mihara.hiroshima.jp", "miyoshi.hiroshima.jp", "naka.hiroshima.jp", "onomichi.hiroshima.jp", "osakikamijima.hiroshima.jp", "otake.hiroshima.jp", "saka.hiroshima.jp", "sera.hiroshima.jp", "seranishi.hiroshima.jp", "shinichi.hiroshima.jp", "shobara.hiroshima.jp", "takehara.hiroshima.jp", "abashiri.hokkaido.jp", "abira.hokkaido.jp", "aibetsu.hokkaido.jp", "akabira.hokkaido.jp", "akkeshi.hokkaido.jp", "asahikawa.hokkaido.jp", "ashibetsu.hokkaido.jp", "ashoro.hokkaido.jp", "assabu.hokkaido.jp", "atsuma.hokkaido.jp", "bibai.hokkaido.jp", "biei.hokkaido.jp", "bifuka.hokkaido.jp", "bihoro.hokkaido.jp", "biratori.hokkaido.jp", "chippubetsu.hokkaido.jp", "chitose.hokkaido.jp", "date.hokkaido.jp", "ebetsu.hokkaido.jp", "embetsu.hokkaido.jp", "eniwa.hokkaido.jp", "erimo.hokkaido.jp", "esan.hokkaido.jp", "esashi.hokkaido.jp", "fukagawa.hokkaido.jp", "fukushima.hokkaido.jp", "furano.hokkaido.jp", "furubira.hokkaido.jp", "haboro.hokkaido.jp", "hakodate.hokkaido.jp", "hamatonbetsu.hokkaido.jp", "hidaka.hokkaido.jp", "higashikagura.hokkaido.jp", "higashikawa.hokkaido.jp", "hiroo.hokkaido.jp", "hokuryu.hokkaido.jp", "hokuto.hokkaido.jp", "honbetsu.hokkaido.jp", "horokanai.hokkaido.jp", "horonobe.hokkaido.jp", "ikeda.hokkaido.jp", "imakane.hokkaido.jp", "ishikari.hokkaido.jp", "iwamizawa.hokkaido.jp", "iwanai.hokkaido.jp", "kamifurano.hokkaido.jp", "kamikawa.hokkaido.jp", "kamishihoro.hokkaido.jp", "kamisunagawa.hokkaido.jp", "kamoenai.hokkaido.jp", "kayabe.hokkaido.jp", "kembuchi.hokkaido.jp", "kikonai.hokkaido.jp", "kimobetsu.hokkaido.jp", "kitahiroshima.hokkaido.jp", "kitami.hokkaido.jp", "kiyosato.hokkaido.jp", "koshimizu.hokkaido.jp", "kunneppu.hokkaido.jp", "kuriyama.hokkaido.jp", "kuromatsunai.hokkaido.jp", "kushiro.hokkaido.jp", "kutchan.hokkaido.jp", "kyowa.hokkaido.jp", "mashike.hokkaido.jp", "matsumae.hokkaido.jp", "mikasa.hokkaido.jp", "minamifurano.hokkaido.jp", "mombetsu.hokkaido.jp", "moseushi.hokkaido.jp", "mukawa.hokkaido.jp", "muroran.hokkaido.jp", "naie.hokkaido.jp", "nakagawa.hokkaido.jp", "nakasatsunai.hokkaido.jp", "nakatombetsu.hokkaido.jp", "nanae.hokkaido.jp", "nanporo.hokkaido.jp", "nayoro.hokkaido.jp", "nemuro.hokkaido.jp", "niikappu.hokkaido.jp", "niki.hokkaido.jp", "nishiokoppe.hokkaido.jp", "noboribetsu.hokkaido.jp", "numata.hokkaido.jp", "obihiro.hokkaido.jp", "obira.hokkaido.jp", "oketo.hokkaido.jp", "okoppe.hokkaido.jp", "otaru.hokkaido.jp", "otobe.hokkaido.jp", "otofuke.hokkaido.jp", "otoineppu.hokkaido.jp", "oumu.hokkaido.jp", "ozora.hokkaido.jp", "pippu.hokkaido.jp", "rankoshi.hokkaido.jp", "rebun.hokkaido.jp", "rikubetsu.hokkaido.jp", "rishiri.hokkaido.jp", "rishirifuji.hokkaido.jp", "saroma.hokkaido.jp", "sarufutsu.hokkaido.jp", "shakotan.hokkaido.jp", "shari.hokkaido.jp", "shibecha.hokkaido.jp", "shibetsu.hokkaido.jp", "shikabe.hokkaido.jp", "shikaoi.hokkaido.jp", "shimamaki.hokkaido.jp", "shimizu.hokkaido.jp", "shimokawa.hokkaido.jp", "shinshinotsu.hokkaido.jp", "shintoku.hokkaido.jp", "shiranuka.hokkaido.jp", "shiraoi.hokkaido.jp", "shiriuchi.hokkaido.jp", "sobetsu.hokkaido.jp", "sunagawa.hokkaido.jp", "taiki.hokkaido.jp", "takasu.hokkaido.jp", "takikawa.hokkaido.jp", "takinoue.hokkaido.jp", "teshikaga.hokkaido.jp", "tobetsu.hokkaido.jp", "tohma.hokkaido.jp", "tomakomai.hokkaido.jp", "tomari.hokkaido.jp", "toya.hokkaido.jp", "toyako.hokkaido.jp", "toyotomi.hokkaido.jp", "toyoura.hokkaido.jp", "tsubetsu.hokkaido.jp", "tsukigata.hokkaido.jp", "urakawa.hokkaido.jp", "urausu.hokkaido.jp", "uryu.hokkaido.jp", "utashinai.hokkaido.jp", "wakkanai.hokkaido.jp", "wassamu.hokkaido.jp", "yakumo.hokkaido.jp", "yoichi.hokkaido.jp", "aioi.hyogo.jp", "akashi.hyogo.jp", "ako.hyogo.jp", "amagasaki.hyogo.jp", "aogaki.hyogo.jp", "asago.hyogo.jp", "ashiya.hyogo.jp", "awaji.hyogo.jp", "fukusaki.hyogo.jp", "goshiki.hyogo.jp", "harima.hyogo.jp", "himeji.hyogo.jp", "ichikawa.hyogo.jp", "inagawa.hyogo.jp", "itami.hyogo.jp", "kakogawa.hyogo.jp", "kamigori.hyogo.jp", "kamikawa.hyogo.jp", "kasai.hyogo.jp", "kasuga.hyogo.jp", "kawanishi.hyogo.jp", "miki.hyogo.jp", "minamiawaji.hyogo.jp", "nishinomiya.hyogo.jp", "nishiwaki.hyogo.jp", "ono.hyogo.jp", "sanda.hyogo.jp", "sannan.hyogo.jp", "sasayama.hyogo.jp", "sayo.hyogo.jp", "shingu.hyogo.jp", "shinonsen.hyogo.jp", "shiso.hyogo.jp", "sumoto.hyogo.jp", "taishi.hyogo.jp", "taka.hyogo.jp", "takarazuka.hyogo.jp", "takasago.hyogo.jp", "takino.hyogo.jp", "tamba.hyogo.jp", "tatsuno.hyogo.jp", "toyooka.hyogo.jp", "yabu.hyogo.jp", "yashiro.hyogo.jp", "yoka.hyogo.jp", "yokawa.hyogo.jp", "ami.ibaraki.jp", "asahi.ibaraki.jp", "bando.ibaraki.jp", "chikusei.ibaraki.jp", "daigo.ibaraki.jp", "fujishiro.ibaraki.jp", "hitachi.ibaraki.jp", "hitachinaka.ibaraki.jp", "hitachiomiya.ibaraki.jp", "hitachiota.ibaraki.jp", "ibaraki.ibaraki.jp", "ina.ibaraki.jp", "inashiki.ibaraki.jp", "itako.ibaraki.jp", "iwama.ibaraki.jp", "joso.ibaraki.jp", "kamisu.ibaraki.jp", "kasama.ibaraki.jp", "kashima.ibaraki.jp", "kasumigaura.ibaraki.jp", "koga.ibaraki.jp", "miho.ibaraki.jp", "mito.ibaraki.jp", "moriya.ibaraki.jp", "naka.ibaraki.jp", "namegata.ibaraki.jp", "oarai.ibaraki.jp", "ogawa.ibaraki.jp", "omitama.ibaraki.jp", "ryugasaki.ibaraki.jp", "sakai.ibaraki.jp", "sakuragawa.ibaraki.jp", "shimodate.ibaraki.jp", "shimotsuma.ibaraki.jp", "shirosato.ibaraki.jp", "sowa.ibaraki.jp", "suifu.ibaraki.jp", "takahagi.ibaraki.jp", "tamatsukuri.ibaraki.jp", "tokai.ibaraki.jp", "tomobe.ibaraki.jp", "tone.ibaraki.jp", "toride.ibaraki.jp", "tsuchiura.ibaraki.jp", "tsukuba.ibaraki.jp", "uchihara.ibaraki.jp", "ushiku.ibaraki.jp", "yachiyo.ibaraki.jp", "yamagata.ibaraki.jp", "yawara.ibaraki.jp", "yuki.ibaraki.jp", "anamizu.ishikawa.jp", "hakui.ishikawa.jp", "hakusan.ishikawa.jp", "kaga.ishikawa.jp", "kahoku.ishikawa.jp", "kanazawa.ishikawa.jp", "kawakita.ishikawa.jp", "komatsu.ishikawa.jp", "nakanoto.ishikawa.jp", "nanao.ishikawa.jp", "nomi.ishikawa.jp", "nonoichi.ishikawa.jp", "noto.ishikawa.jp", "shika.ishikawa.jp", "suzu.ishikawa.jp", "tsubata.ishikawa.jp", "tsurugi.ishikawa.jp", "uchinada.ishikawa.jp", "wajima.ishikawa.jp", "fudai.iwate.jp", "fujisawa.iwate.jp", "hanamaki.iwate.jp", "hiraizumi.iwate.jp", "hirono.iwate.jp", "ichinohe.iwate.jp", "ichinoseki.iwate.jp", "iwaizumi.iwate.jp", "iwate.iwate.jp", "joboji.iwate.jp", "kamaishi.iwate.jp", "kanegasaki.iwate.jp", "karumai.iwate.jp", "kawai.iwate.jp", "kitakami.iwate.jp", "kuji.iwate.jp", "kunohe.iwate.jp", "kuzumaki.iwate.jp", "miyako.iwate.jp", "mizusawa.iwate.jp", "morioka.iwate.jp", "ninohe.iwate.jp", "noda.iwate.jp", "ofunato.iwate.jp", "oshu.iwate.jp", "otsuchi.iwate.jp", "rikuzentakata.iwate.jp", "shiwa.iwate.jp", "shizukuishi.iwate.jp", "sumita.iwate.jp", "takizawa.iwate.jp", "tanohata.iwate.jp", "tono.iwate.jp", "yahaba.iwate.jp", "yamada.iwate.jp", "ayagawa.kagawa.jp", "higashikagawa.kagawa.jp", "kanonji.kagawa.jp", "kotohira.kagawa.jp", "manno.kagawa.jp", "marugame.kagawa.jp", "mitoyo.kagawa.jp", "naoshima.kagawa.jp", "sanuki.kagawa.jp", "tadotsu.kagawa.jp", "takamatsu.kagawa.jp", "tonosho.kagawa.jp", "uchinomi.kagawa.jp", "utazu.kagawa.jp", "zentsuji.kagawa.jp", "akune.kagoshima.jp", "amami.kagoshima.jp", "hioki.kagoshima.jp", "isa.kagoshima.jp", "isen.kagoshima.jp", "izumi.kagoshima.jp", "kagoshima.kagoshima.jp", "kanoya.kagoshima.jp", "kawanabe.kagoshima.jp", "kinko.kagoshima.jp", "kouyama.kagoshima.jp", "makurazaki.kagoshima.jp", "matsumoto.kagoshima.jp", "minamitane.kagoshima.jp", "nakatane.kagoshima.jp", "nishinoomote.kagoshima.jp", "satsumasendai.kagoshima.jp", "soo.kagoshima.jp", "tarumizu.kagoshima.jp", "yusui.kagoshima.jp", "aikawa.kanagawa.jp", "atsugi.kanagawa.jp", "ayase.kanagawa.jp", "chigasaki.kanagawa.jp", "ebina.kanagawa.jp", "fujisawa.kanagawa.jp", "hadano.kanagawa.jp", "hakone.kanagawa.jp", "hiratsuka.kanagawa.jp", "isehara.kanagawa.jp", "kaisei.kanagawa.jp", "kamakura.kanagawa.jp", "kiyokawa.kanagawa.jp", "matsuda.kanagawa.jp", "minamiashigara.kanagawa.jp", "miura.kanagawa.jp", "nakai.kanagawa.jp", "ninomiya.kanagawa.jp", "odawara.kanagawa.jp", "oi.kanagawa.jp", "oiso.kanagawa.jp", "sagamihara.kanagawa.jp", "samukawa.kanagawa.jp", "tsukui.kanagawa.jp", "yamakita.kanagawa.jp", "yamato.kanagawa.jp", "yokosuka.kanagawa.jp", "yugawara.kanagawa.jp", "zama.kanagawa.jp", "zushi.kanagawa.jp", "aki.kochi.jp", "geisei.kochi.jp", "hidaka.kochi.jp", "higashitsuno.kochi.jp", "ino.kochi.jp", "kagami.kochi.jp", "kami.kochi.jp", "kitagawa.kochi.jp", "kochi.kochi.jp", "mihara.kochi.jp", "motoyama.kochi.jp", "muroto.kochi.jp", "nahari.kochi.jp", "nakamura.kochi.jp", "nankoku.kochi.jp", "nishitosa.kochi.jp", "niyodogawa.kochi.jp", "ochi.kochi.jp", "okawa.kochi.jp", "otoyo.kochi.jp", "otsuki.kochi.jp", "sakawa.kochi.jp", "sukumo.kochi.jp", "susaki.kochi.jp", "tosa.kochi.jp", "tosashimizu.kochi.jp", "toyo.kochi.jp", "tsuno.kochi.jp", "umaji.kochi.jp", "yasuda.kochi.jp", "yusuhara.kochi.jp", "amakusa.kumamoto.jp", "arao.kumamoto.jp", "aso.kumamoto.jp", "choyo.kumamoto.jp", "gyokuto.kumamoto.jp", "hitoyoshi.kumamoto.jp", "kamiamakusa.kumamoto.jp", "kashima.kumamoto.jp", "kikuchi.kumamoto.jp", "kosa.kumamoto.jp", "kumamoto.kumamoto.jp", "mashiki.kumamoto.jp", "mifune.kumamoto.jp", "minamata.kumamoto.jp", "minamioguni.kumamoto.jp", "nagasu.kumamoto.jp", "nishihara.kumamoto.jp", "oguni.kumamoto.jp", "ozu.kumamoto.jp", "sumoto.kumamoto.jp", "takamori.kumamoto.jp", "uki.kumamoto.jp", "uto.kumamoto.jp", "yamaga.kumamoto.jp", "yamato.kumamoto.jp", "yatsushiro.kumamoto.jp", "ayabe.kyoto.jp", "fukuchiyama.kyoto.jp", "higashiyama.kyoto.jp", "ide.kyoto.jp", "ine.kyoto.jp", "joyo.kyoto.jp", "kameoka.kyoto.jp", "kamo.kyoto.jp", "kita.kyoto.jp", "kizu.kyoto.jp", "kumiyama.kyoto.jp", "kyotamba.kyoto.jp", "kyotanabe.kyoto.jp", "kyotango.kyoto.jp", "maizuru.kyoto.jp", "minami.kyoto.jp", "minamiyamashiro.kyoto.jp", "miyazu.kyoto.jp", "muko.kyoto.jp", "nagaokakyo.kyoto.jp", "nakagyo.kyoto.jp", "nantan.kyoto.jp", "oyamazaki.kyoto.jp", "sakyo.kyoto.jp", "seika.kyoto.jp", "tanabe.kyoto.jp", "uji.kyoto.jp", "ujitawara.kyoto.jp", "wazuka.kyoto.jp", "yamashina.kyoto.jp", "yawata.kyoto.jp", "asahi.mie.jp", "inabe.mie.jp", "ise.mie.jp", "kameyama.mie.jp", "kawagoe.mie.jp", "kiho.mie.jp", "kisosaki.mie.jp", "kiwa.mie.jp", "komono.mie.jp", "kumano.mie.jp", "kuwana.mie.jp", "matsusaka.mie.jp", "meiwa.mie.jp", "mihama.mie.jp", "minamiise.mie.jp", "misugi.mie.jp", "miyama.mie.jp", "nabari.mie.jp", "shima.mie.jp", "suzuka.mie.jp", "tado.mie.jp", "taiki.mie.jp", "taki.mie.jp", "tamaki.mie.jp", "toba.mie.jp", "tsu.mie.jp", "udono.mie.jp", "ureshino.mie.jp", "watarai.mie.jp", "yokkaichi.mie.jp", "furukawa.miyagi.jp", "higashimatsushima.miyagi.jp", "ishinomaki.miyagi.jp", "iwanuma.miyagi.jp", "kakuda.miyagi.jp", "kami.miyagi.jp", "kawasaki.miyagi.jp", "kesennuma.miyagi.jp", "marumori.miyagi.jp", "matsushima.miyagi.jp", "minamisanriku.miyagi.jp", "misato.miyagi.jp", "murata.miyagi.jp", "natori.miyagi.jp", "ogawara.miyagi.jp", "ohira.miyagi.jp", "onagawa.miyagi.jp", "osaki.miyagi.jp", "rifu.miyagi.jp", "semine.miyagi.jp", "shibata.miyagi.jp", "shichikashuku.miyagi.jp", "shikama.miyagi.jp", "shiogama.miyagi.jp", "shiroishi.miyagi.jp", "tagajo.miyagi.jp", "taiwa.miyagi.jp", "tome.miyagi.jp", "tomiya.miyagi.jp", "wakuya.miyagi.jp", "watari.miyagi.jp", "yamamoto.miyagi.jp", "zao.miyagi.jp", "aya.miyazaki.jp", "ebino.miyazaki.jp", "gokase.miyazaki.jp", "hyuga.miyazaki.jp", "kadogawa.miyazaki.jp", "kawaminami.miyazaki.jp", "kijo.miyazaki.jp", "kitagawa.miyazaki.jp", "kitakata.miyazaki.jp", "kitaura.miyazaki.jp", "kobayashi.miyazaki.jp", "kunitomi.miyazaki.jp", "kushima.miyazaki.jp", "mimata.miyazaki.jp", "miyakonojo.miyazaki.jp", "miyazaki.miyazaki.jp", "morotsuka.miyazaki.jp", "nichinan.miyazaki.jp", "nishimera.miyazaki.jp", "nobeoka.miyazaki.jp", "saito.miyazaki.jp", "shiiba.miyazaki.jp", "shintomi.miyazaki.jp", "takaharu.miyazaki.jp", "takanabe.miyazaki.jp", "takazaki.miyazaki.jp", "tsuno.miyazaki.jp", "achi.nagano.jp", "agematsu.nagano.jp", "anan.nagano.jp", "aoki.nagano.jp", "asahi.nagano.jp", "azumino.nagano.jp", "chikuhoku.nagano.jp", "chikuma.nagano.jp", "chino.nagano.jp", "fujimi.nagano.jp", "hakuba.nagano.jp", "hara.nagano.jp", "hiraya.nagano.jp", "iida.nagano.jp", "iijima.nagano.jp", "iiyama.nagano.jp", "iizuna.nagano.jp", "ikeda.nagano.jp", "ikusaka.nagano.jp", "ina.nagano.jp", "karuizawa.nagano.jp", "kawakami.nagano.jp", "kiso.nagano.jp", "kisofukushima.nagano.jp", "kitaaiki.nagano.jp", "komagane.nagano.jp", "komoro.nagano.jp", "matsukawa.nagano.jp", "matsumoto.nagano.jp", "miasa.nagano.jp", "minamiaiki.nagano.jp", "minamimaki.nagano.jp", "minamiminowa.nagano.jp", "minowa.nagano.jp", "miyada.nagano.jp", "miyota.nagano.jp", "mochizuki.nagano.jp", "nagano.nagano.jp", "nagawa.nagano.jp", "nagiso.nagano.jp", "nakagawa.nagano.jp", "nakano.nagano.jp", "nozawaonsen.nagano.jp", "obuse.nagano.jp", "ogawa.nagano.jp", "okaya.nagano.jp", "omachi.nagano.jp", "omi.nagano.jp", "ookuwa.nagano.jp", "ooshika.nagano.jp", "otaki.nagano.jp", "otari.nagano.jp", "sakae.nagano.jp", "sakaki.nagano.jp", "saku.nagano.jp", "sakuho.nagano.jp", "shimosuwa.nagano.jp", "shinanomachi.nagano.jp", "shiojiri.nagano.jp", "suwa.nagano.jp", "suzaka.nagano.jp", "takagi.nagano.jp", "takamori.nagano.jp", "takayama.nagano.jp", "tateshina.nagano.jp", "tatsuno.nagano.jp", "togakushi.nagano.jp", "togura.nagano.jp", "tomi.nagano.jp", "ueda.nagano.jp", "wada.nagano.jp", "yamagata.nagano.jp", "yamanouchi.nagano.jp", "yasaka.nagano.jp", "yasuoka.nagano.jp", "chijiwa.nagasaki.jp", "futsu.nagasaki.jp", "goto.nagasaki.jp", "hasami.nagasaki.jp", "hirado.nagasaki.jp", "iki.nagasaki.jp", "isahaya.nagasaki.jp", "kawatana.nagasaki.jp", "kuchinotsu.nagasaki.jp", "matsuura.nagasaki.jp", "nagasaki.nagasaki.jp", "obama.nagasaki.jp", "omura.nagasaki.jp", "oseto.nagasaki.jp", "saikai.nagasaki.jp", "sasebo.nagasaki.jp", "seihi.nagasaki.jp", "shimabara.nagasaki.jp", "shinkamigoto.nagasaki.jp", "togitsu.nagasaki.jp", "tsushima.nagasaki.jp", "unzen.nagasaki.jp", "ando.nara.jp", "gose.nara.jp", "heguri.nara.jp", "higashiyoshino.nara.jp", "ikaruga.nara.jp", "ikoma.nara.jp", "kamikitayama.nara.jp", "kanmaki.nara.jp", "kashiba.nara.jp", "kashihara.nara.jp", "katsuragi.nara.jp", "kawai.nara.jp", "kawakami.nara.jp", "kawanishi.nara.jp", "koryo.nara.jp", "kurotaki.nara.jp", "mitsue.nara.jp", "miyake.nara.jp", "nara.nara.jp", "nosegawa.nara.jp", "oji.nara.jp", "ouda.nara.jp", "oyodo.nara.jp", "sakurai.nara.jp", "sango.nara.jp", "shimoichi.nara.jp", "shimokitayama.nara.jp", "shinjo.nara.jp", "soni.nara.jp", "takatori.nara.jp", "tawaramoto.nara.jp", "tenkawa.nara.jp", "tenri.nara.jp", "uda.nara.jp", "yamatokoriyama.nara.jp", "yamatotakada.nara.jp", "yamazoe.nara.jp", "yoshino.nara.jp", "aga.niigata.jp", "agano.niigata.jp", "gosen.niigata.jp", "itoigawa.niigata.jp", "izumozaki.niigata.jp", "joetsu.niigata.jp", "kamo.niigata.jp", "kariwa.niigata.jp", "kashiwazaki.niigata.jp", "minamiuonuma.niigata.jp", "mitsuke.niigata.jp", "muika.niigata.jp", "murakami.niigata.jp", "myoko.niigata.jp", "nagaoka.niigata.jp", "niigata.niigata.jp", "ojiya.niigata.jp", "omi.niigata.jp", "sado.niigata.jp", "sanjo.niigata.jp", "seiro.niigata.jp", "seirou.niigata.jp", "sekikawa.niigata.jp", "shibata.niigata.jp", "tagami.niigata.jp", "tainai.niigata.jp", "tochio.niigata.jp", "tokamachi.niigata.jp", "tsubame.niigata.jp", "tsunan.niigata.jp", "uonuma.niigata.jp", "yahiko.niigata.jp", "yoita.niigata.jp", "yuzawa.niigata.jp", "beppu.oita.jp", "bungoono.oita.jp", "bungotakada.oita.jp", "hasama.oita.jp", "hiji.oita.jp", "himeshima.oita.jp", "hita.oita.jp", "kamitsue.oita.jp", "kokonoe.oita.jp", "kuju.oita.jp", "kunisaki.oita.jp", "kusu.oita.jp", "oita.oita.jp", "saiki.oita.jp", "taketa.oita.jp", "tsukumi.oita.jp", "usa.oita.jp", "usuki.oita.jp", "yufu.oita.jp", "akaiwa.okayama.jp", "asakuchi.okayama.jp", "bizen.okayama.jp", "hayashima.okayama.jp", "ibara.okayama.jp", "kagamino.okayama.jp", "kasaoka.okayama.jp", "kibichuo.okayama.jp", "kumenan.okayama.jp", "kurashiki.okayama.jp", "maniwa.okayama.jp", "misaki.okayama.jp", "nagi.okayama.jp", "niimi.okayama.jp", "nishiawakura.okayama.jp", "okayama.okayama.jp", "satosho.okayama.jp", "setouchi.okayama.jp", "shinjo.okayama.jp", "shoo.okayama.jp", "soja.okayama.jp", "takahashi.okayama.jp", "tamano.okayama.jp", "tsuyama.okayama.jp", "wake.okayama.jp", "yakage.okayama.jp", "aguni.okinawa.jp", "ginowan.okinawa.jp", "ginoza.okinawa.jp", "gushikami.okinawa.jp", "haebaru.okinawa.jp", "higashi.okinawa.jp", "hirara.okinawa.jp", "iheya.okinawa.jp", "ishigaki.okinawa.jp", "ishikawa.okinawa.jp", "itoman.okinawa.jp", "izena.okinawa.jp", "kadena.okinawa.jp", "kin.okinawa.jp", "kitadaito.okinawa.jp", "kitanakagusuku.okinawa.jp", "kumejima.okinawa.jp", "kunigami.okinawa.jp", "minamidaito.okinawa.jp", "motobu.okinawa.jp", "nago.okinawa.jp", "naha.okinawa.jp", "nakagusuku.okinawa.jp", "nakijin.okinawa.jp", "nanjo.okinawa.jp", "nishihara.okinawa.jp", "ogimi.okinawa.jp", "okinawa.okinawa.jp", "onna.okinawa.jp", "shimoji.okinawa.jp", "taketomi.okinawa.jp", "tarama.okinawa.jp", "tokashiki.okinawa.jp", "tomigusuku.okinawa.jp", "tonaki.okinawa.jp", "urasoe.okinawa.jp", "uruma.okinawa.jp", "yaese.okinawa.jp", "yomitan.okinawa.jp", "yonabaru.okinawa.jp", "yonaguni.okinawa.jp", "zamami.okinawa.jp", "abeno.osaka.jp", "chihayaakasaka.osaka.jp", "chuo.osaka.jp", "daito.osaka.jp", "fujiidera.osaka.jp", "habikino.osaka.jp", "hannan.osaka.jp", "higashiosaka.osaka.jp", "higashisumiyoshi.osaka.jp", "higashiyodogawa.osaka.jp", "hirakata.osaka.jp", "ibaraki.osaka.jp", "ikeda.osaka.jp", "izumi.osaka.jp", "izumiotsu.osaka.jp", "izumisano.osaka.jp", "kadoma.osaka.jp", "kaizuka.osaka.jp", "kanan.osaka.jp", "kashiwara.osaka.jp", "katano.osaka.jp", "kawachinagano.osaka.jp", "kishiwada.osaka.jp", "kita.osaka.jp", "kumatori.osaka.jp", "matsubara.osaka.jp", "minato.osaka.jp", "minoh.osaka.jp", "misaki.osaka.jp", "moriguchi.osaka.jp", "neyagawa.osaka.jp", "nishi.osaka.jp", "nose.osaka.jp", "osakasayama.osaka.jp", "sakai.osaka.jp", "sayama.osaka.jp", "sennan.osaka.jp", "settsu.osaka.jp", "shijonawate.osaka.jp", "shimamoto.osaka.jp", "suita.osaka.jp", "tadaoka.osaka.jp", "taishi.osaka.jp", "tajiri.osaka.jp", "takaishi.osaka.jp", "takatsuki.osaka.jp", "tondabayashi.osaka.jp", "toyonaka.osaka.jp", "toyono.osaka.jp", "yao.osaka.jp", "ariake.saga.jp", "arita.saga.jp", "fukudomi.saga.jp", "genkai.saga.jp", "hamatama.saga.jp", "hizen.saga.jp", "imari.saga.jp", "kamimine.saga.jp", "kanzaki.saga.jp", "karatsu.saga.jp", "kashima.saga.jp", "kitagata.saga.jp", "kitahata.saga.jp", "kiyama.saga.jp", "kouhoku.saga.jp", "kyuragi.saga.jp", "nishiarita.saga.jp", "ogi.saga.jp", "omachi.saga.jp", "ouchi.saga.jp", "saga.saga.jp", "shiroishi.saga.jp", "taku.saga.jp", "tara.saga.jp", "tosu.saga.jp", "yoshinogari.saga.jp", "arakawa.saitama.jp", "asaka.saitama.jp", "chichibu.saitama.jp", "fujimi.saitama.jp", "fujimino.saitama.jp", "fukaya.saitama.jp", "hanno.saitama.jp", "hanyu.saitama.jp", "hasuda.saitama.jp", "hatogaya.saitama.jp", "hatoyama.saitama.jp", "hidaka.saitama.jp", "higashichichibu.saitama.jp", "higashimatsuyama.saitama.jp", "honjo.saitama.jp", "ina.saitama.jp", "iruma.saitama.jp", "iwatsuki.saitama.jp", "kamiizumi.saitama.jp", "kamikawa.saitama.jp", "kamisato.saitama.jp", "kasukabe.saitama.jp", "kawagoe.saitama.jp", "kawaguchi.saitama.jp", "kawajima.saitama.jp", "kazo.saitama.jp", "kitamoto.saitama.jp", "koshigaya.saitama.jp", "kounosu.saitama.jp", "kuki.saitama.jp", "kumagaya.saitama.jp", "matsubushi.saitama.jp", "minano.saitama.jp", "misato.saitama.jp", "miyashiro.saitama.jp", "miyoshi.saitama.jp", "moroyama.saitama.jp", "nagatoro.saitama.jp", "namegawa.saitama.jp", "niiza.saitama.jp", "ogano.saitama.jp", "ogawa.saitama.jp", "ogose.saitama.jp", "okegawa.saitama.jp", "omiya.saitama.jp", "otaki.saitama.jp", "ranzan.saitama.jp", "ryokami.saitama.jp", "saitama.saitama.jp", "sakado.saitama.jp", "satte.saitama.jp", "sayama.saitama.jp", "shiki.saitama.jp", "shiraoka.saitama.jp", "soka.saitama.jp", "sugito.saitama.jp", "toda.saitama.jp", "tokigawa.saitama.jp", "tokorozawa.saitama.jp", "tsurugashima.saitama.jp", "urawa.saitama.jp", "warabi.saitama.jp", "yashio.saitama.jp", "yokoze.saitama.jp", "yono.saitama.jp", "yorii.saitama.jp", "yoshida.saitama.jp", "yoshikawa.saitama.jp", "yoshimi.saitama.jp", "aisho.shiga.jp", "gamo.shiga.jp", "higashiomi.shiga.jp", "hikone.shiga.jp", "koka.shiga.jp", "konan.shiga.jp", "kosei.shiga.jp", "koto.shiga.jp", "kusatsu.shiga.jp", "maibara.shiga.jp", "moriyama.shiga.jp", "nagahama.shiga.jp", "nishiazai.shiga.jp", "notogawa.shiga.jp", "omihachiman.shiga.jp", "otsu.shiga.jp", "ritto.shiga.jp", "ryuoh.shiga.jp", "takashima.shiga.jp", "takatsuki.shiga.jp", "torahime.shiga.jp", "toyosato.shiga.jp", "yasu.shiga.jp", "akagi.shimane.jp", "ama.shimane.jp", "gotsu.shimane.jp", "hamada.shimane.jp", "higashiizumo.shimane.jp", "hikawa.shimane.jp", "hikimi.shimane.jp", "izumo.shimane.jp", "kakinoki.shimane.jp", "masuda.shimane.jp", "matsue.shimane.jp", "misato.shimane.jp", "nishinoshima.shimane.jp", "ohda.shimane.jp", "okinoshima.shimane.jp", "okuizumo.shimane.jp", "shimane.shimane.jp", "tamayu.shimane.jp", "tsuwano.shimane.jp", "unnan.shimane.jp", "yakumo.shimane.jp", "yasugi.shimane.jp", "yatsuka.shimane.jp", "arai.shizuoka.jp", "atami.shizuoka.jp", "fuji.shizuoka.jp", "fujieda.shizuoka.jp", "fujikawa.shizuoka.jp", "fujinomiya.shizuoka.jp", "fukuroi.shizuoka.jp", "gotemba.shizuoka.jp", "haibara.shizuoka.jp", "hamamatsu.shizuoka.jp", "higashiizu.shizuoka.jp", "ito.shizuoka.jp", "iwata.shizuoka.jp", "izu.shizuoka.jp", "izunokuni.shizuoka.jp", "kakegawa.shizuoka.jp", "kannami.shizuoka.jp", "kawanehon.shizuoka.jp", "kawazu.shizuoka.jp", "kikugawa.shizuoka.jp", "kosai.shizuoka.jp", "makinohara.shizuoka.jp", "matsuzaki.shizuoka.jp", "minamiizu.shizuoka.jp", "mishima.shizuoka.jp", "morimachi.shizuoka.jp", "nishiizu.shizuoka.jp", "numazu.shizuoka.jp", "omaezaki.shizuoka.jp", "shimada.shizuoka.jp", "shimizu.shizuoka.jp", "shimoda.shizuoka.jp", "shizuoka.shizuoka.jp", "susono.shizuoka.jp", "yaizu.shizuoka.jp", "yoshida.shizuoka.jp", "ashikaga.tochigi.jp", "bato.tochigi.jp", "haga.tochigi.jp", "ichikai.tochigi.jp", "iwafune.tochigi.jp", "kaminokawa.tochigi.jp", "kanuma.tochigi.jp", "karasuyama.tochigi.jp", "kuroiso.tochigi.jp", "mashiko.tochigi.jp", "mibu.tochigi.jp", "moka.tochigi.jp", "motegi.tochigi.jp", "nasu.tochigi.jp", "nasushiobara.tochigi.jp", "nikko.tochigi.jp", "nishikata.tochigi.jp", "nogi.tochigi.jp", "ohira.tochigi.jp", "ohtawara.tochigi.jp", "oyama.tochigi.jp", "sakura.tochigi.jp", "sano.tochigi.jp", "shimotsuke.tochigi.jp", "shioya.tochigi.jp", "takanezawa.tochigi.jp", "tochigi.tochigi.jp", "tsuga.tochigi.jp", "ujiie.tochigi.jp", "utsunomiya.tochigi.jp", "yaita.tochigi.jp", "aizumi.tokushima.jp", "anan.tokushima.jp", "ichiba.tokushima.jp", "itano.tokushima.jp", "kainan.tokushima.jp", "komatsushima.tokushima.jp", "matsushige.tokushima.jp", "mima.tokushima.jp", "minami.tokushima.jp", "miyoshi.tokushima.jp", "mugi.tokushima.jp", "nakagawa.tokushima.jp", "naruto.tokushima.jp", "sanagochi.tokushima.jp", "shishikui.tokushima.jp", "tokushima.tokushima.jp", "wajiki.tokushima.jp", "adachi.tokyo.jp", "akiruno.tokyo.jp", "akishima.tokyo.jp", "aogashima.tokyo.jp", "arakawa.tokyo.jp", "bunkyo.tokyo.jp", "chiyoda.tokyo.jp", "chofu.tokyo.jp", "chuo.tokyo.jp", "edogawa.tokyo.jp", "fuchu.tokyo.jp", "fussa.tokyo.jp", "hachijo.tokyo.jp", "hachioji.tokyo.jp", "hamura.tokyo.jp", "higashikurume.tokyo.jp", "higashimurayama.tokyo.jp", "higashiyamato.tokyo.jp", "hino.tokyo.jp", "hinode.tokyo.jp", "hinohara.tokyo.jp", "inagi.tokyo.jp", "itabashi.tokyo.jp", "katsushika.tokyo.jp", "kita.tokyo.jp", "kiyose.tokyo.jp", "kodaira.tokyo.jp", "koganei.tokyo.jp", "kokubunji.tokyo.jp", "komae.tokyo.jp", "koto.tokyo.jp", "kouzushima.tokyo.jp", "kunitachi.tokyo.jp", "machida.tokyo.jp", "meguro.tokyo.jp", "minato.tokyo.jp", "mitaka.tokyo.jp", "mizuho.tokyo.jp", "musashimurayama.tokyo.jp", "musashino.tokyo.jp", "nakano.tokyo.jp", "nerima.tokyo.jp", "ogasawara.tokyo.jp", "okutama.tokyo.jp", "ome.tokyo.jp", "oshima.tokyo.jp", "ota.tokyo.jp", "setagaya.tokyo.jp", "shibuya.tokyo.jp", "shinagawa.tokyo.jp", "shinjuku.tokyo.jp", "suginami.tokyo.jp", "sumida.tokyo.jp", "tachikawa.tokyo.jp", "taito.tokyo.jp", "tama.tokyo.jp", "toshima.tokyo.jp", "chizu.tottori.jp", "hino.tottori.jp", "kawahara.tottori.jp", "koge.tottori.jp", "kotoura.tottori.jp", "misasa.tottori.jp", "nanbu.tottori.jp", "nichinan.tottori.jp", "sakaiminato.tottori.jp", "tottori.tottori.jp", "wakasa.tottori.jp", "yazu.tottori.jp", "yonago.tottori.jp", "asahi.toyama.jp", "fuchu.toyama.jp", "fukumitsu.toyama.jp", "funahashi.toyama.jp", "himi.toyama.jp", "imizu.toyama.jp", "inami.toyama.jp", "johana.toyama.jp", "kamiichi.toyama.jp", "kurobe.toyama.jp", "nakaniikawa.toyama.jp", "namerikawa.toyama.jp", "nanto.toyama.jp", "nyuzen.toyama.jp", "oyabe.toyama.jp", "taira.toyama.jp", "takaoka.toyama.jp", "tateyama.toyama.jp", "toga.toyama.jp", "tonami.toyama.jp", "toyama.toyama.jp", "unazuki.toyama.jp", "uozu.toyama.jp", "yamada.toyama.jp", "arida.wakayama.jp", "aridagawa.wakayama.jp", "gobo.wakayama.jp", "hashimoto.wakayama.jp", "hidaka.wakayama.jp", "hirogawa.wakayama.jp", "inami.wakayama.jp", "iwade.wakayama.jp", "kainan.wakayama.jp", "kamitonda.wakayama.jp", "katsuragi.wakayama.jp", "kimino.wakayama.jp", "kinokawa.wakayama.jp", "kitayama.wakayama.jp", "koya.wakayama.jp", "koza.wakayama.jp", "kozagawa.wakayama.jp", "kudoyama.wakayama.jp", "kushimoto.wakayama.jp", "mihama.wakayama.jp", "misato.wakayama.jp", "nachikatsuura.wakayama.jp", "shingu.wakayama.jp", "shirahama.wakayama.jp", "taiji.wakayama.jp", "tanabe.wakayama.jp", "wakayama.wakayama.jp", "yuasa.wakayama.jp", "yura.wakayama.jp", "asahi.yamagata.jp", "funagata.yamagata.jp", "higashine.yamagata.jp", "iide.yamagata.jp", "kahoku.yamagata.jp", "kaminoyama.yamagata.jp", "kaneyama.yamagata.jp", "kawanishi.yamagata.jp", "mamurogawa.yamagata.jp", "mikawa.yamagata.jp", "murayama.yamagata.jp", "nagai.yamagata.jp", "nakayama.yamagata.jp", "nanyo.yamagata.jp", "nishikawa.yamagata.jp", "obanazawa.yamagata.jp", "oe.yamagata.jp", "oguni.yamagata.jp", "ohkura.yamagata.jp", "oishida.yamagata.jp", "sagae.yamagata.jp", "sakata.yamagata.jp", "sakegawa.yamagata.jp", "shinjo.yamagata.jp", "shirataka.yamagata.jp", "shonai.yamagata.jp", "takahata.yamagata.jp", "tendo.yamagata.jp", "tozawa.yamagata.jp", "tsuruoka.yamagata.jp", "yamagata.yamagata.jp", "yamanobe.yamagata.jp", "yonezawa.yamagata.jp", "yuza.yamagata.jp", "abu.yamaguchi.jp", "hagi.yamaguchi.jp", "hikari.yamaguchi.jp", "hofu.yamaguchi.jp", "iwakuni.yamaguchi.jp", "kudamatsu.yamaguchi.jp", "mitou.yamaguchi.jp", "nagato.yamaguchi.jp", "oshima.yamaguchi.jp", "shimonoseki.yamaguchi.jp", "shunan.yamaguchi.jp", "tabuse.yamaguchi.jp", "tokuyama.yamaguchi.jp", "toyota.yamaguchi.jp", "ube.yamaguchi.jp", "yuu.yamaguchi.jp", "chuo.yamanashi.jp", "doshi.yamanashi.jp", "fuefuki.yamanashi.jp", "fujikawa.yamanashi.jp", "fujikawaguchiko.yamanashi.jp", "fujiyoshida.yamanashi.jp", "hayakawa.yamanashi.jp", "hokuto.yamanashi.jp", "ichikawamisato.yamanashi.jp", "kai.yamanashi.jp", "kofu.yamanashi.jp", "koshu.yamanashi.jp", "kosuge.yamanashi.jp", "minami-alps.yamanashi.jp", "minobu.yamanashi.jp", "nakamichi.yamanashi.jp", "nanbu.yamanashi.jp", "narusawa.yamanashi.jp", "nirasaki.yamanashi.jp", "nishikatsura.yamanashi.jp", "oshino.yamanashi.jp", "otsuki.yamanashi.jp", "showa.yamanashi.jp", "tabayama.yamanashi.jp", "tsuru.yamanashi.jp", "uenohara.yamanashi.jp", "yamanakako.yamanashi.jp", "yamanashi.yamanashi.jp", "*.ke", "kg", "org.kg", "net.kg", "com.kg", "edu.kg", "gov.kg", "mil.kg", "*.kh", "ki", "edu.ki", "biz.ki", "net.ki", "org.ki", "gov.ki", "info.ki", "com.ki", "km", "org.km", "nom.km", "gov.km", "prd.km", "tm.km", "edu.km", "mil.km", "ass.km", "com.km", "coop.km", "asso.km", "presse.km", "medecin.km", "notaires.km", "pharmaciens.km", "veterinaire.km", "gouv.km", "kn", "net.kn", "org.kn", "edu.kn", "gov.kn", "com.kp", "edu.kp", "gov.kp", "org.kp", "rep.kp", "tra.kp", "kr", "ac.kr", "co.kr", "es.kr", "go.kr", "hs.kr", "kg.kr", "mil.kr", "ms.kr", "ne.kr", "or.kr", "pe.kr", "re.kr", "sc.kr", "busan.kr", "chungbuk.kr", "chungnam.kr", "daegu.kr", "daejeon.kr", "gangwon.kr", "gwangju.kr", "gyeongbuk.kr", "gyeonggi.kr", "gyeongnam.kr", "incheon.kr", "jeju.kr", "jeonbuk.kr", "jeonnam.kr", "seoul.kr", "ulsan.kr", "*.kw", "ky", "edu.ky", "gov.ky", "com.ky", "org.ky", "net.ky", "kz", "org.kz", "edu.kz", "net.kz", "gov.kz", "mil.kz", "com.kz", "la", "int.la", "net.la", "info.la", "edu.la", "gov.la", "per.la", "com.la", "org.la", "com.lb", "edu.lb", "gov.lb", "net.lb", "org.lb", "lc", "com.lc", "net.lc", "co.lc", "org.lc", "edu.lc", "gov.lc", "li", "lk", "gov.lk", "sch.lk", "net.lk", "int.lk", "com.lk", "org.lk", "edu.lk", "ngo.lk", "soc.lk", "web.lk", "ltd.lk", "assn.lk", "grp.lk", "hotel.lk", "com.lr", "edu.lr", "gov.lr", "org.lr", "net.lr", "ls", "co.ls", "org.ls", "lt", "gov.lt", "lu", "lv", "com.lv", "edu.lv", "gov.lv", "org.lv", "mil.lv", "id.lv", "net.lv", "asn.lv", "conf.lv", "ly", "com.ly", "net.ly", "gov.ly", "plc.ly", "edu.ly", "sch.ly", "med.ly", "org.ly", "id.ly", "ma", "co.ma", "net.ma", "gov.ma", "org.ma", "ac.ma", "press.ma", "mc", "tm.mc", "asso.mc", "md", "me", "co.me", "net.me", "org.me", "edu.me", "ac.me", "gov.me", "its.me", "priv.me", "mg", "org.mg", "nom.mg", "gov.mg", "prd.mg", "tm.mg", "edu.mg", "mil.mg", "com.mg", "mh", "mil", "mk", "com.mk", "org.mk", "net.mk", "edu.mk", "gov.mk", "inf.mk", "name.mk", "ml", "com.ml", "edu.ml", "gouv.ml", "gov.ml", "net.ml", "org.ml", "presse.ml", "*.mm", "mn", "gov.mn", "edu.mn", "org.mn", "mo", "com.mo", "net.mo", "org.mo", "edu.mo", "gov.mo", "mobi", "mp", "mq", "mr", "gov.mr", "ms", "*.mt", "mu", "com.mu", "net.mu", "org.mu", "gov.mu", "ac.mu", "co.mu", "or.mu", "museum", "academy.museum", "agriculture.museum", "air.museum", "airguard.museum", "alabama.museum", "alaska.museum", "amber.museum", "ambulance.museum", "american.museum", "americana.museum", "americanantiques.museum", "americanart.museum", "amsterdam.museum", "and.museum", "annefrank.museum", "anthro.museum", "anthropology.museum", "antiques.museum", "aquarium.museum", "arboretum.museum", "archaeological.museum", "archaeology.museum", "architecture.museum", "art.museum", "artanddesign.museum", "artcenter.museum", "artdeco.museum", "arteducation.museum", "artgallery.museum", "arts.museum", "artsandcrafts.museum", "asmatart.museum", "assassination.museum", "assisi.museum", "association.museum", "astronomy.museum", "atlanta.museum", "austin.museum", "australia.museum", "automotive.museum", "aviation.museum", "axis.museum", "badajoz.museum", "baghdad.museum", "bahn.museum", "bale.museum", "baltimore.museum", "barcelona.museum", "baseball.museum", "basel.museum", "baths.museum", "bauern.museum", "beauxarts.museum", "beeldengeluid.museum", "bellevue.museum", "bergbau.museum", "berkeley.museum", "berlin.museum", "bern.museum", "bible.museum", "bilbao.museum", "bill.museum", "birdart.museum", "birthplace.museum", "bonn.museum", "boston.museum", "botanical.museum", "botanicalgarden.museum", "botanicgarden.museum", "botany.museum", "brandywinevalley.museum", "brasil.museum", "bristol.museum", "british.museum", "britishcolumbia.museum", "broadcast.museum", "brunel.museum", "brussel.museum", "brussels.museum", "bruxelles.museum", "building.museum", "burghof.museum", "bus.museum", "bushey.museum", "cadaques.museum", "california.museum", "cambridge.museum", "can.museum", "canada.museum", "capebreton.museum", "carrier.museum", "cartoonart.museum", "casadelamoneda.museum", "castle.museum", "castres.museum", "celtic.museum", "center.museum", "chattanooga.museum", "cheltenham.museum", "chesapeakebay.museum", "chicago.museum", "children.museum", "childrens.museum", "childrensgarden.museum", "chiropractic.museum", "chocolate.museum", "christiansburg.museum", "cincinnati.museum", "cinema.museum", "circus.museum", "civilisation.museum", "civilization.museum", "civilwar.museum", "clinton.museum", "clock.museum", "coal.museum", "coastaldefence.museum", "cody.museum", "coldwar.museum", "collection.museum", "colonialwilliamsburg.museum", "coloradoplateau.museum", "columbia.museum", "columbus.museum", "communication.museum", "communications.museum", "community.museum", "computer.museum", "computerhistory.museum", "xn--comunicaes-v6a2o.museum", "contemporary.museum", "contemporaryart.museum", "convent.museum", "copenhagen.museum", "corporation.museum", "xn--correios-e-telecomunicaes-ghc29a.museum", "corvette.museum", "costume.museum", "countryestate.museum", "county.museum", "crafts.museum", "cranbrook.museum", "creation.museum", "cultural.museum", "culturalcenter.museum", "culture.museum", "cyber.museum", "cymru.museum", "dali.museum", "dallas.museum", "database.museum", "ddr.museum", "decorativearts.museum", "delaware.museum", "delmenhorst.museum", "denmark.museum", "depot.museum", "design.museum", "detroit.museum", "dinosaur.museum", "discovery.museum", "dolls.museum", "donostia.museum", "durham.museum", "eastafrica.museum", "eastcoast.museum", "education.museum", "educational.museum", "egyptian.museum", "eisenbahn.museum", "elburg.museum", "elvendrell.museum", "embroidery.museum", "encyclopedic.museum", "england.museum", "entomology.museum", "environment.museum", "environmentalconservation.museum", "epilepsy.museum", "essex.museum", "estate.museum", "ethnology.museum", "exeter.museum", "exhibition.museum", "family.museum", "farm.museum", "farmequipment.museum", "farmers.museum", "farmstead.museum", "field.museum", "figueres.museum", "filatelia.museum", "film.museum", "fineart.museum", "finearts.museum", "finland.museum", "flanders.museum", "florida.museum", "force.museum", "fortmissoula.museum", "fortworth.museum", "foundation.museum", "francaise.museum", "frankfurt.museum", "franziskaner.museum", "freemasonry.museum", "freiburg.museum", "fribourg.museum", "frog.museum", "fundacio.museum", "furniture.museum", "gallery.museum", "garden.museum", "gateway.museum", "geelvinck.museum", "gemological.museum", "geology.museum", "georgia.museum", "giessen.museum", "glas.museum", "glass.museum", "gorge.museum", "grandrapids.museum", "graz.museum", "guernsey.museum", "halloffame.museum", "hamburg.museum", "handson.museum", "harvestcelebration.museum", "hawaii.museum", "health.museum", "heimatunduhren.museum", "hellas.museum", "helsinki.museum", "hembygdsforbund.museum", "heritage.museum", "histoire.museum", "historical.museum", "historicalsociety.museum", "historichouses.museum", "historisch.museum", "historisches.museum", "history.museum", "historyofscience.museum", "horology.museum", "house.museum", "humanities.museum", "illustration.museum", "imageandsound.museum", "indian.museum", "indiana.museum", "indianapolis.museum", "indianmarket.museum", "intelligence.museum", "interactive.museum", "iraq.museum", "iron.museum", "isleofman.museum", "jamison.museum", "jefferson.museum", "jerusalem.museum", "jewelry.museum", "jewish.museum", "jewishart.museum", "jfk.museum", "journalism.museum", "judaica.museum", "judygarland.museum", "juedisches.museum", "juif.museum", "karate.museum", "karikatur.museum", "kids.museum", "koebenhavn.museum", "koeln.museum", "kunst.museum", "kunstsammlung.museum", "kunstunddesign.museum", "labor.museum", "labour.museum", "lajolla.museum", "lancashire.museum", "landes.museum", "lans.museum", "xn--lns-qla.museum", "larsson.museum", "lewismiller.museum", "lincoln.museum", "linz.museum", "living.museum", "livinghistory.museum", "localhistory.museum", "london.museum", "losangeles.museum", "louvre.museum", "loyalist.museum", "lucerne.museum", "luxembourg.museum", "luzern.museum", "mad.museum", "madrid.museum", "mallorca.museum", "manchester.museum", "mansion.museum", "mansions.museum", "manx.museum", "marburg.museum", "maritime.museum", "maritimo.museum", "maryland.museum", "marylhurst.museum", "media.museum", "medical.museum", "medizinhistorisches.museum", "meeres.museum", "memorial.museum", "mesaverde.museum", "michigan.museum", "midatlantic.museum", "military.museum", "mill.museum", "miners.museum", "mining.museum", "minnesota.museum", "missile.museum", "missoula.museum", "modern.museum", "moma.museum", "money.museum", "monmouth.museum", "monticello.museum", "montreal.museum", "moscow.museum", "motorcycle.museum", "muenchen.museum", "muenster.museum", "mulhouse.museum", "muncie.museum", "museet.museum", "museumcenter.museum", "museumvereniging.museum", "music.museum", "national.museum", "nationalfirearms.museum", "nationalheritage.museum", "nativeamerican.museum", "naturalhistory.museum", "naturalhistorymuseum.museum", "naturalsciences.museum", "nature.museum", "naturhistorisches.museum", "natuurwetenschappen.museum", "naumburg.museum", "naval.museum", "nebraska.museum", "neues.museum", "newhampshire.museum", "newjersey.museum", "newmexico.museum", "newport.museum", "newspaper.museum", "newyork.museum", "niepce.museum", "norfolk.museum", "north.museum", "nrw.museum", "nuernberg.museum", "nuremberg.museum", "nyc.museum", "nyny.museum", "oceanographic.museum", "oceanographique.museum", "omaha.museum", "online.museum", "ontario.museum", "openair.museum", "oregon.museum", "oregontrail.museum", "otago.museum", "oxford.museum", "pacific.museum", "paderborn.museum", "palace.museum", "paleo.museum", "palmsprings.museum", "panama.museum", "paris.museum", "pasadena.museum", "pharmacy.museum", "philadelphia.museum", "philadelphiaarea.museum", "philately.museum", "phoenix.museum", "photography.museum", "pilots.museum", "pittsburgh.museum", "planetarium.museum", "plantation.museum", "plants.museum", "plaza.museum", "portal.museum", "portland.museum", "portlligat.museum", "posts-and-telecommunications.museum", "preservation.museum", "presidio.museum", "press.museum", "project.museum", "public.museum", "pubol.museum", "quebec.museum", "railroad.museum", "railway.museum", "research.museum", "resistance.museum", "riodejaneiro.museum", "rochester.museum", "rockart.museum", "roma.museum", "russia.museum", "saintlouis.museum", "salem.museum", "salvadordali.museum", "salzburg.museum", "sandiego.museum", "sanfrancisco.museum", "santabarbara.museum", "santacruz.museum", "santafe.museum", "saskatchewan.museum", "satx.museum", "savannahga.museum", "schlesisches.museum", "schoenbrunn.museum", "schokoladen.museum", "school.museum", "schweiz.museum", "science.museum", "scienceandhistory.museum", "scienceandindustry.museum", "sciencecenter.museum", "sciencecenters.museum", "science-fiction.museum", "sciencehistory.museum", "sciences.museum", "sciencesnaturelles.museum", "scotland.museum", "seaport.museum", "settlement.museum", "settlers.museum", "shell.museum", "sherbrooke.museum", "sibenik.museum", "silk.museum", "ski.museum", "skole.museum", "society.museum", "sologne.museum", "soundandvision.museum", "southcarolina.museum", "southwest.museum", "space.museum", "spy.museum", "square.museum", "stadt.museum", "stalbans.museum", "starnberg.museum", "state.museum", "stateofdelaware.museum", "station.museum", "steam.museum", "steiermark.museum", "stjohn.museum", "stockholm.museum", "stpetersburg.museum", "stuttgart.museum", "suisse.museum", "surgeonshall.museum", "surrey.museum", "svizzera.museum", "sweden.museum", "sydney.museum", "tank.museum", "tcm.museum", "technology.museum", "telekommunikation.museum", "television.museum", "texas.museum", "textile.museum", "theater.museum", "time.museum", "timekeeping.museum", "topology.museum", "torino.museum", "touch.museum", "town.museum", "transport.museum", "tree.museum", "trolley.museum", "trust.museum", "trustee.museum", "uhren.museum", "ulm.museum", "undersea.museum", "university.museum", "usa.museum", "usantiques.museum", "usarts.museum", "uscountryestate.museum", "usculture.museum", "usdecorativearts.museum", "usgarden.museum", "ushistory.museum", "ushuaia.museum", "uslivinghistory.museum", "utah.museum", "uvic.museum", "valley.museum", "vantaa.museum", "versailles.museum", "viking.museum", "village.museum", "virginia.museum", "virtual.museum", "virtuel.museum", "vlaanderen.museum", "volkenkunde.museum", "wales.museum", "wallonie.museum", "war.museum", "washingtondc.museum", "watchandclock.museum", "watch-and-clock.museum", "western.museum", "westfalen.museum", "whaling.museum", "wildlife.museum", "williamsburg.museum", "windmill.museum", "workshop.museum", "york.museum", "yorkshire.museum", "yosemite.museum", "youth.museum", "zoological.museum", "zoology.museum", "xn--9dbhblg6di.museum", "xn--h1aegh.museum", "mv", "aero.mv", "biz.mv", "com.mv", "coop.mv", "edu.mv", "gov.mv", "info.mv", "int.mv", "mil.mv", "museum.mv", "name.mv", "net.mv", "org.mv", "pro.mv", "mw", "ac.mw", "biz.mw", "co.mw", "com.mw", "coop.mw", "edu.mw", "gov.mw", "int.mw", "museum.mw", "net.mw", "org.mw", "mx", "com.mx", "org.mx", "gob.mx", "edu.mx", "net.mx", "my", "com.my", "net.my", "org.my", "gov.my", "edu.my", "mil.my", "name.my", "*.mz", "!teledata.mz", "na", "info.na", "pro.na", "name.na", "school.na", "or.na", "dr.na", "us.na", "mx.na", "ca.na", "in.na", "cc.na", "tv.na", "ws.na", "mobi.na", "co.na", "com.na", "org.na", "name", "nc", "asso.nc", "ne", "net", "nf", "com.nf", "net.nf", "per.nf", "rec.nf", "web.nf", "arts.nf", "firm.nf", "info.nf", "other.nf", "store.nf", "ng", "com.ng", "edu.ng", "name.ng", "net.ng", "org.ng", "sch.ng", "gov.ng", "mil.ng", "mobi.ng", "*.ni", "nl", "bv.nl", "no", "fhs.no", "vgs.no", "fylkesbibl.no", "folkebibl.no", "museum.no", "idrett.no", "priv.no", "mil.no", "stat.no", "dep.no", "kommune.no", "herad.no", "aa.no", "ah.no", "bu.no", "fm.no", "hl.no", "hm.no", "jan-mayen.no", "mr.no", "nl.no", "nt.no", "of.no", "ol.no", "oslo.no", "rl.no", "sf.no", "st.no", "svalbard.no", "tm.no", "tr.no", "va.no", "vf.no", "gs.aa.no", "gs.ah.no", "gs.bu.no", "gs.fm.no", "gs.hl.no", "gs.hm.no", "gs.jan-mayen.no", "gs.mr.no", "gs.nl.no", "gs.nt.no", "gs.of.no", "gs.ol.no", "gs.oslo.no", "gs.rl.no", "gs.sf.no", "gs.st.no", "gs.svalbard.no", "gs.tm.no", "gs.tr.no", "gs.va.no", "gs.vf.no", "akrehamn.no", "xn--krehamn-dxa.no", "algard.no", "xn--lgrd-poac.no", "arna.no", "brumunddal.no", "bryne.no", "bronnoysund.no", "xn--brnnysund-m8ac.no", "drobak.no", "xn--drbak-wua.no", "egersund.no", "fetsund.no", "floro.no", "xn--flor-jra.no", "fredrikstad.no", "hokksund.no", "honefoss.no", "xn--hnefoss-q1a.no", "jessheim.no", "jorpeland.no", "xn--jrpeland-54a.no", "kirkenes.no", "kopervik.no", "krokstadelva.no", "langevag.no", "xn--langevg-jxa.no", "leirvik.no", "mjondalen.no", "xn--mjndalen-64a.no", "mo-i-rana.no", "mosjoen.no", "xn--mosjen-eya.no", "nesoddtangen.no", "orkanger.no", "osoyro.no", "xn--osyro-wua.no", "raholt.no", "xn--rholt-mra.no", "sandnessjoen.no", "xn--sandnessjen-ogb.no", "skedsmokorset.no", "slattum.no", "spjelkavik.no", "stathelle.no", "stavern.no", "stjordalshalsen.no", "xn--stjrdalshalsen-sqb.no", "tananger.no", "tranby.no", "vossevangen.no", "afjord.no", "xn--fjord-lra.no", "agdenes.no", "al.no", "xn--l-1fa.no", "alesund.no", "xn--lesund-hua.no", "alstahaug.no", "alta.no", "xn--lt-liac.no", "alaheadju.no", "xn--laheadju-7ya.no", "alvdal.no", "amli.no", "xn--mli-tla.no", "amot.no", "xn--mot-tla.no", "andebu.no", "andoy.no", "xn--andy-ira.no", "andasuolo.no", "ardal.no", "xn--rdal-poa.no", "aremark.no", "arendal.no", "xn--s-1fa.no", "aseral.no", "xn--seral-lra.no", "asker.no", "askim.no", "askvoll.no", "askoy.no", "xn--asky-ira.no", "asnes.no", "xn--snes-poa.no", "audnedaln.no", "aukra.no", "aure.no", "aurland.no", "aurskog-holand.no", "xn--aurskog-hland-jnb.no", "austevoll.no", "austrheim.no", "averoy.no", "xn--avery-yua.no", "balestrand.no", "ballangen.no", "balat.no", "xn--blt-elab.no", "balsfjord.no", "bahccavuotna.no", "xn--bhccavuotna-k7a.no", "bamble.no", "bardu.no", "beardu.no", "beiarn.no", "bajddar.no", "xn--bjddar-pta.no", "baidar.no", "xn--bidr-5nac.no", "berg.no", "bergen.no", "berlevag.no", "xn--berlevg-jxa.no", "bearalvahki.no", "xn--bearalvhki-y4a.no", "bindal.no", "birkenes.no", "bjarkoy.no", "xn--bjarky-fya.no", "bjerkreim.no", "bjugn.no", "bodo.no", "xn--bod-2na.no", "badaddja.no", "xn--bdddj-mrabd.no", "budejju.no", "bokn.no", "bremanger.no", "bronnoy.no", "xn--brnny-wuac.no", "bygland.no", "bykle.no", "barum.no", "xn--brum-voa.no", "bo.telemark.no", "xn--b-5ga.telemark.no", "bo.nordland.no", "xn--b-5ga.nordland.no", "bievat.no", "xn--bievt-0qa.no", "bomlo.no", "xn--bmlo-gra.no", "batsfjord.no", "xn--btsfjord-9za.no", "bahcavuotna.no", "xn--bhcavuotna-s4a.no", "dovre.no", "drammen.no", "drangedal.no", "dyroy.no", "xn--dyry-ira.no", "donna.no", "xn--dnna-gra.no", "eid.no", "eidfjord.no", "eidsberg.no", "eidskog.no", "eidsvoll.no", "eigersund.no", "elverum.no", "enebakk.no", "engerdal.no", "etne.no", "etnedal.no", "evenes.no", "evenassi.no", "xn--eveni-0qa01ga.no", "evje-og-hornnes.no", "farsund.no", "fauske.no", "fuossko.no", "fuoisku.no", "fedje.no", "fet.no", "finnoy.no", "xn--finny-yua.no", "fitjar.no", "fjaler.no", "fjell.no", "flakstad.no", "flatanger.no", "flekkefjord.no", "flesberg.no", "flora.no", "fla.no", "xn--fl-zia.no", "folldal.no", "forsand.no", "fosnes.no", "frei.no", "frogn.no", "froland.no", "frosta.no", "frana.no", "xn--frna-woa.no", "froya.no", "xn--frya-hra.no", "fusa.no", "fyresdal.no", "forde.no", "xn--frde-gra.no", "gamvik.no", "gangaviika.no", "xn--ggaviika-8ya47h.no", "gaular.no", "gausdal.no", "gildeskal.no", "xn--gildeskl-g0a.no", "giske.no", "gjemnes.no", "gjerdrum.no", "gjerstad.no", "gjesdal.no", "gjovik.no", "xn--gjvik-wua.no", "gloppen.no", "gol.no", "gran.no", "grane.no", "granvin.no", "gratangen.no", "grimstad.no", "grong.no", "kraanghke.no", "xn--kranghke-b0a.no", "grue.no", "gulen.no", "hadsel.no", "halden.no", "halsa.no", "hamar.no", "hamaroy.no", "habmer.no", "xn--hbmer-xqa.no", "hapmir.no", "xn--hpmir-xqa.no", "hammerfest.no", "hammarfeasta.no", "xn--hmmrfeasta-s4ac.no", "haram.no", "hareid.no", "harstad.no", "hasvik.no", "aknoluokta.no", "xn--koluokta-7ya57h.no", "hattfjelldal.no", "aarborte.no", "haugesund.no", "hemne.no", "hemnes.no", "hemsedal.no", "heroy.more-og-romsdal.no", "xn--hery-ira.xn--mre-og-romsdal-qqb.no", "heroy.nordland.no", "xn--hery-ira.nordland.no", "hitra.no", "hjartdal.no", "hjelmeland.no", "hobol.no", "xn--hobl-ira.no", "hof.no", "hol.no", "hole.no", "holmestrand.no", "holtalen.no", "xn--holtlen-hxa.no", "hornindal.no", "horten.no", "hurdal.no", "hurum.no", "hvaler.no", "hyllestad.no", "hagebostad.no", "xn--hgebostad-g3a.no", "hoyanger.no", "xn--hyanger-q1a.no", "hoylandet.no", "xn--hylandet-54a.no", "ha.no", "xn--h-2fa.no", "ibestad.no", "inderoy.no", "xn--indery-fya.no", "iveland.no", "jevnaker.no", "jondal.no", "jolster.no", "xn--jlster-bya.no", "karasjok.no", "karasjohka.no", "xn--krjohka-hwab49j.no", "karlsoy.no", "galsa.no", "xn--gls-elac.no", "karmoy.no", "xn--karmy-yua.no", "kautokeino.no", "guovdageaidnu.no", "klepp.no", "klabu.no", "xn--klbu-woa.no", "kongsberg.no", "kongsvinger.no", "kragero.no", "xn--krager-gya.no", "kristiansand.no", "kristiansund.no", "krodsherad.no", "xn--krdsherad-m8a.no", "kvalsund.no", "rahkkeravju.no", "xn--rhkkervju-01af.no", "kvam.no", "kvinesdal.no", "kvinnherad.no", "kviteseid.no", "kvitsoy.no", "xn--kvitsy-fya.no", "kvafjord.no", "xn--kvfjord-nxa.no", "giehtavuoatna.no", "kvanangen.no", "xn--kvnangen-k0a.no", "navuotna.no", "xn--nvuotna-hwa.no", "kafjord.no", "xn--kfjord-iua.no", "gaivuotna.no", "xn--givuotna-8ya.no", "larvik.no", "lavangen.no", "lavagis.no", "loabat.no", "xn--loabt-0qa.no", "lebesby.no", "davvesiida.no", "leikanger.no", "leirfjord.no", "leka.no", "leksvik.no", "lenvik.no", "leangaviika.no", "xn--leagaviika-52b.no", "lesja.no", "levanger.no", "lier.no", "lierne.no", "lillehammer.no", "lillesand.no", "lindesnes.no", "lindas.no", "xn--linds-pra.no", "lom.no", "loppa.no", "lahppi.no", "xn--lhppi-xqa.no", "lund.no", "lunner.no", "luroy.no", "xn--lury-ira.no", "luster.no", "lyngdal.no", "lyngen.no", "ivgu.no", "lardal.no", "lerdal.no", "xn--lrdal-sra.no", "lodingen.no", "xn--ldingen-q1a.no", "lorenskog.no", "xn--lrenskog-54a.no", "loten.no", "xn--lten-gra.no", "malvik.no", "masoy.no", "xn--msy-ula0h.no", "muosat.no", "xn--muost-0qa.no", "mandal.no", "marker.no", "marnardal.no", "masfjorden.no", "meland.no", "meldal.no", "melhus.no", "meloy.no", "xn--mely-ira.no", "meraker.no", "xn--merker-kua.no", "moareke.no", "xn--moreke-jua.no", "midsund.no", "midtre-gauldal.no", "modalen.no", "modum.no", "molde.no", "moskenes.no", "moss.no", "mosvik.no", "malselv.no", "xn--mlselv-iua.no", "malatvuopmi.no", "xn--mlatvuopmi-s4a.no", "namdalseid.no", "aejrie.no", "namsos.no", "namsskogan.no", "naamesjevuemie.no", "xn--nmesjevuemie-tcba.no", "laakesvuemie.no", "nannestad.no", "narvik.no", "narviika.no", "naustdal.no", "nedre-eiker.no", "nes.akershus.no", "nes.buskerud.no", "nesna.no", "nesodden.no", "nesseby.no", "unjarga.no", "xn--unjrga-rta.no", "nesset.no", "nissedal.no", "nittedal.no", "nord-aurdal.no", "nord-fron.no", "nord-odal.no", "norddal.no", "nordkapp.no", "davvenjarga.no", "xn--davvenjrga-y4a.no", "nordre-land.no", "nordreisa.no", "raisa.no", "xn--risa-5na.no", "nore-og-uvdal.no", "notodden.no", "naroy.no", "xn--nry-yla5g.no", "notteroy.no", "xn--nttery-byae.no", "odda.no", "oksnes.no", "xn--ksnes-uua.no", "oppdal.no", "oppegard.no", "xn--oppegrd-ixa.no", "orkdal.no", "orland.no", "xn--rland-uua.no", "orskog.no", "xn--rskog-uua.no", "orsta.no", "xn--rsta-fra.no", "os.hedmark.no", "os.hordaland.no", "osen.no", "osteroy.no", "xn--ostery-fya.no", "ostre-toten.no", "xn--stre-toten-zcb.no", "overhalla.no", "ovre-eiker.no", "xn--vre-eiker-k8a.no", "oyer.no", "xn--yer-zna.no", "oygarden.no", "xn--ygarden-p1a.no", "oystre-slidre.no", "xn--ystre-slidre-ujb.no", "porsanger.no", "porsangu.no", "xn--porsgu-sta26f.no", "porsgrunn.no", "radoy.no", "xn--rady-ira.no", "rakkestad.no", "rana.no", "ruovat.no", "randaberg.no", "rauma.no", "rendalen.no", "rennebu.no", "rennesoy.no", "xn--rennesy-v1a.no", "rindal.no", "ringebu.no", "ringerike.no", "ringsaker.no", "rissa.no", "risor.no", "xn--risr-ira.no", "roan.no", "rollag.no", "rygge.no", "ralingen.no", "xn--rlingen-mxa.no", "rodoy.no", "xn--rdy-0nab.no", "romskog.no", "xn--rmskog-bya.no", "roros.no", "xn--rros-gra.no", "rost.no", "xn--rst-0na.no", "royken.no", "xn--ryken-vua.no", "royrvik.no", "xn--ryrvik-bya.no", "rade.no", "xn--rde-ula.no", "salangen.no", "siellak.no", "saltdal.no", "salat.no", "xn--slt-elab.no", "xn--slat-5na.no", "samnanger.no", "sande.more-og-romsdal.no", "sande.xn--mre-og-romsdal-qqb.no", "sande.vestfold.no", "sandefjord.no", "sandnes.no", "sandoy.no", "xn--sandy-yua.no", "sarpsborg.no", "sauda.no", "sauherad.no", "sel.no", "selbu.no", "selje.no", "seljord.no", "sigdal.no", "siljan.no", "sirdal.no", "skaun.no", "skedsmo.no", "ski.no", "skien.no", "skiptvet.no", "skjervoy.no", "xn--skjervy-v1a.no", "skierva.no", "xn--skierv-uta.no", "skjak.no", "xn--skjk-soa.no", "skodje.no", "skanland.no", "xn--sknland-fxa.no", "skanit.no", "xn--sknit-yqa.no", "smola.no", "xn--smla-hra.no", "snillfjord.no", "snasa.no", "xn--snsa-roa.no", "snoasa.no", "snaase.no", "xn--snase-nra.no", "sogndal.no", "sokndal.no", "sola.no", "solund.no", "songdalen.no", "sortland.no", "spydeberg.no", "stange.no", "stavanger.no", "steigen.no", "steinkjer.no", "stjordal.no", "xn--stjrdal-s1a.no", "stokke.no", "stor-elvdal.no", "stord.no", "stordal.no", "storfjord.no", "omasvuotna.no", "strand.no", "stranda.no", "stryn.no", "sula.no", "suldal.no", "sund.no", "sunndal.no", "surnadal.no", "sveio.no", "svelvik.no", "sykkylven.no", "sogne.no", "xn--sgne-gra.no", "somna.no", "xn--smna-gra.no", "sondre-land.no", "xn--sndre-land-0cb.no", "sor-aurdal.no", "xn--sr-aurdal-l8a.no", "sor-fron.no", "xn--sr-fron-q1a.no", "sor-odal.no", "xn--sr-odal-q1a.no", "sor-varanger.no", "xn--sr-varanger-ggb.no", "matta-varjjat.no", "xn--mtta-vrjjat-k7af.no", "sorfold.no", "xn--srfold-bya.no", "sorreisa.no", "xn--srreisa-q1a.no", "sorum.no", "xn--srum-gra.no", "tana.no", "deatnu.no", "time.no", "tingvoll.no", "tinn.no", "tjeldsund.no", "dielddanuorri.no", "tjome.no", "xn--tjme-hra.no", "tokke.no", "tolga.no", "torsken.no", "tranoy.no", "xn--trany-yua.no", "tromso.no", "xn--troms-zua.no", "tromsa.no", "romsa.no", "trondheim.no", "troandin.no", "trysil.no", "trana.no", "xn--trna-woa.no", "trogstad.no", "xn--trgstad-r1a.no", "tvedestrand.no", "tydal.no", "tynset.no", "tysfjord.no", "divtasvuodna.no", "divttasvuotna.no", "tysnes.no", "tysvar.no", "xn--tysvr-vra.no", "tonsberg.no", "xn--tnsberg-q1a.no", "ullensaker.no", "ullensvang.no", "ulvik.no", "utsira.no", "vadso.no", "xn--vads-jra.no", "cahcesuolo.no", "xn--hcesuolo-7ya35b.no", "vaksdal.no", "valle.no", "vang.no", "vanylven.no", "vardo.no", "xn--vard-jra.no", "varggat.no", "xn--vrggt-xqad.no", "vefsn.no", "vaapste.no", "vega.no", "vegarshei.no", "xn--vegrshei-c0a.no", "vennesla.no", "verdal.no", "verran.no", "vestby.no", "vestnes.no", "vestre-slidre.no", "vestre-toten.no", "vestvagoy.no", "xn--vestvgy-ixa6o.no", "vevelstad.no", "vik.no", "vikna.no", "vindafjord.no", "volda.no", "voss.no", "varoy.no", "xn--vry-yla5g.no", "vagan.no", "xn--vgan-qoa.no", "voagat.no", "vagsoy.no", "xn--vgsy-qoa0j.no", "vaga.no", "xn--vg-yiab.no", "valer.ostfold.no", "xn--vler-qoa.xn--stfold-9xa.no", "valer.hedmark.no", "xn--vler-qoa.hedmark.no", "*.np", "nr", "biz.nr", "info.nr", "gov.nr", "edu.nr", "org.nr", "net.nr", "com.nr", "nu", "*.nz", "om", "co.om", "com.om", "edu.om", "gov.om", "med.om", "museum.om", "net.om", "org.om", "pro.om", "!mediaphone.om", "!nawrastelecom.om", "!nawras.om", "!omanmobile.om", "!omanpost.om", "!omantel.om", "!rakpetroleum.om", "!siemens.om", "!songfest.om", "!statecouncil.om", "org", "pa", "ac.pa", "gob.pa", "com.pa", "org.pa", "sld.pa", "edu.pa", "net.pa", "ing.pa", "abo.pa", "med.pa", "nom.pa", "pe", "edu.pe", "gob.pe", "nom.pe", "mil.pe", "org.pe", "com.pe", "net.pe", "pf", "com.pf", "org.pf", "edu.pf", "*.pg", "ph", "com.ph", "net.ph", "org.ph", "gov.ph", "edu.ph", "ngo.ph", "mil.ph", "i.ph", "pk", "com.pk", "net.pk", "edu.pk", "org.pk", "fam.pk", "biz.pk", "web.pk", "gov.pk", "gob.pk", "gok.pk", "gon.pk", "gop.pk", "gos.pk", "info.pk", "pl", "aid.pl", "agro.pl", "atm.pl", "auto.pl", "biz.pl", "com.pl", "edu.pl", "gmina.pl", "gsm.pl", "info.pl", "mail.pl", "miasta.pl", "media.pl", "mil.pl", "net.pl", "nieruchomosci.pl", "nom.pl", "org.pl", "pc.pl", "powiat.pl", "priv.pl", "realestate.pl", "rel.pl", "sex.pl", "shop.pl", "sklep.pl", "sos.pl", "szkola.pl", "targi.pl", "tm.pl", "tourism.pl", "travel.pl", "turystyka.pl", "6bone.pl", "art.pl", "mbone.pl", "gov.pl", "uw.gov.pl", "um.gov.pl", "ug.gov.pl", "upow.gov.pl", "starostwo.gov.pl", "so.gov.pl", "sr.gov.pl", "po.gov.pl", "pa.gov.pl", "ngo.pl", "irc.pl", "usenet.pl", "augustow.pl", "babia-gora.pl", "bedzin.pl", "beskidy.pl", "bialowieza.pl", "bialystok.pl", "bielawa.pl", "bieszczady.pl", "boleslawiec.pl", "bydgoszcz.pl", "bytom.pl", "cieszyn.pl", "czeladz.pl", "czest.pl", "dlugoleka.pl", "elblag.pl", "elk.pl", "glogow.pl", "gniezno.pl", "gorlice.pl", "grajewo.pl", "ilawa.pl", "jaworzno.pl", "jelenia-gora.pl", "jgora.pl", "kalisz.pl", "kazimierz-dolny.pl", "karpacz.pl", "kartuzy.pl", "kaszuby.pl", "katowice.pl", "kepno.pl", "ketrzyn.pl", "klodzko.pl", "kobierzyce.pl", "kolobrzeg.pl", "konin.pl", "konskowola.pl", "kutno.pl", "lapy.pl", "lebork.pl", "legnica.pl", "lezajsk.pl", "limanowa.pl", "lomza.pl", "lowicz.pl", "lubin.pl", "lukow.pl", "malbork.pl", "malopolska.pl", "mazowsze.pl", "mazury.pl", "mielec.pl", "mielno.pl", "mragowo.pl", "naklo.pl", "nowaruda.pl", "nysa.pl", "olawa.pl", "olecko.pl", "olkusz.pl", "olsztyn.pl", "opoczno.pl", "opole.pl", "ostroda.pl", "ostroleka.pl", "ostrowiec.pl", "ostrowwlkp.pl", "pila.pl", "pisz.pl", "podhale.pl", "podlasie.pl", "polkowice.pl", "pomorze.pl", "pomorskie.pl", "prochowice.pl", "pruszkow.pl", "przeworsk.pl", "pulawy.pl", "radom.pl", "rawa-maz.pl", "rybnik.pl", "rzeszow.pl", "sanok.pl", "sejny.pl", "siedlce.pl", "slask.pl", "slupsk.pl", "sosnowiec.pl", "stalowa-wola.pl", "skoczow.pl", "starachowice.pl", "stargard.pl", "suwalki.pl", "swidnica.pl", "swiebodzin.pl", "swinoujscie.pl", "szczecin.pl", "szczytno.pl", "tarnobrzeg.pl", "tgory.pl", "turek.pl", "tychy.pl", "ustka.pl", "walbrzych.pl", "warmia.pl", "warszawa.pl", "waw.pl", "wegrow.pl", "wielun.pl", "wlocl.pl", "wloclawek.pl", "wodzislaw.pl", "wolomin.pl", "wroclaw.pl", "zachpomor.pl", "zagan.pl", "zarow.pl", "zgora.pl", "zgorzelec.pl", "gda.pl", "gdansk.pl", "gdynia.pl", "med.pl", "sopot.pl", "gliwice.pl", "krakow.pl", "poznan.pl", "wroc.pl", "zakopane.pl", "pm", "pn", "gov.pn", "co.pn", "org.pn", "edu.pn", "net.pn", "post", "pr", "com.pr", "net.pr", "org.pr", "gov.pr", "edu.pr", "isla.pr", "pro.pr", "biz.pr", "info.pr", "name.pr", "est.pr", "prof.pr", "ac.pr", "pro", "aca.pro", "bar.pro", "cpa.pro", "jur.pro", "law.pro", "med.pro", "eng.pro", "ps", "edu.ps", "gov.ps", "sec.ps", "plo.ps", "com.ps", "org.ps", "net.ps", "pt", "net.pt", "gov.pt", "org.pt", "edu.pt", "int.pt", "publ.pt", "com.pt", "nome.pt", "pw", "co.pw", "ne.pw", "or.pw", "ed.pw", "go.pw", "belau.pw", "py", "com.py", "coop.py", "edu.py", "gov.py", "mil.py", "net.py", "org.py", "qa", "com.qa", "edu.qa", "gov.qa", "mil.qa", "name.qa", "net.qa", "org.qa", "sch.qa", "re", "com.re", "asso.re", "nom.re", "ro", "com.ro", "org.ro", "tm.ro", "nt.ro", "nom.ro", "info.ro", "rec.ro", "arts.ro", "firm.ro", "store.ro", "www.ro", "rs", "co.rs", "org.rs", "edu.rs", "ac.rs", "gov.rs", "in.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", "mosreg.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", "pskov.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", "magnitka.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", "mil.ru", "test.ru", "rw", "gov.rw", "net.rw", "edu.rw", "ac.rw", "com.rw", "co.rw", "int.rw", "mil.rw", "gouv.rw", "sa", "com.sa", "net.sa", "org.sa", "gov.sa", "med.sa", "pub.sa", "edu.sa", "sch.sa", "sb", "com.sb", "edu.sb", "gov.sb", "net.sb", "org.sb", "sc", "com.sc", "gov.sc", "net.sc", "org.sc", "edu.sc", "sd", "com.sd", "net.sd", "org.sd", "edu.sd", "med.sd", "tv.sd", "gov.sd", "info.sd", "se", "a.se", "ac.se", "b.se", "bd.se", "brand.se", "c.se", "d.se", "e.se", "f.se", "fh.se", "fhsk.se", "fhv.se", "g.se", "h.se", "i.se", "k.se", "komforb.se", "kommunalforbund.se", "komvux.se", "l.se", "lanbib.se", "m.se", "n.se", "naturbruksgymn.se", "o.se", "org.se", "p.se", "parti.se", "pp.se", "press.se", "r.se", "s.se", "sshn.se", "t.se", "tm.se", "u.se", "w.se", "x.se", "y.se", "z.se", "sg", "com.sg", "net.sg", "org.sg", "gov.sg", "edu.sg", "per.sg", "sh", "com.sh", "net.sh", "gov.sh", "org.sh", "mil.sh", "si", "sk", "sl", "com.sl", "net.sl", "edu.sl", "gov.sl", "org.sl", "sm", "sn", "art.sn", "com.sn", "edu.sn", "gouv.sn", "org.sn", "perso.sn", "univ.sn", "so", "com.so", "net.so", "org.so", "sr", "st", "co.st", "com.st", "consulado.st", "edu.st", "embaixada.st", "gov.st", "mil.st", "net.st", "org.st", "principe.st", "saotome.st", "store.st", "su", "sv", "com.sv", "edu.sv", "gob.sv", "org.sv", "red.sv", "sx", "gov.sx", "sy", "edu.sy", "gov.sy", "net.sy", "mil.sy", "com.sy", "org.sy", "sz", "co.sz", "ac.sz", "org.sz", "tc", "td", "tel", "tf", "tg", "th", "ac.th", "co.th", "go.th", "in.th", "mi.th", "net.th", "or.th", "tj", "ac.tj", "biz.tj", "co.tj", "com.tj", "edu.tj", "go.tj", "gov.tj", "int.tj", "mil.tj", "name.tj", "net.tj", "nic.tj", "org.tj", "test.tj", "web.tj", "tk", "tl", "gov.tl", "tm", "com.tm", "co.tm", "org.tm", "net.tm", "nom.tm", "gov.tm", "mil.tm", "edu.tm", "tn", "com.tn", "ens.tn", "fin.tn", "gov.tn", "ind.tn", "intl.tn", "nat.tn", "net.tn", "org.tn", "info.tn", "perso.tn", "tourism.tn", "edunet.tn", "rnrt.tn", "rns.tn", "rnu.tn", "mincom.tn", "agrinet.tn", "defense.tn", "turen.tn", "to", "com.to", "gov.to", "net.to", "org.to", "edu.to", "mil.to", "*.tr", "!nic.tr", "gov.nc.tr", "travel", "tt", "co.tt", "com.tt", "org.tt", "net.tt", "biz.tt", "info.tt", "pro.tt", "int.tt", "coop.tt", "jobs.tt", "mobi.tt", "travel.tt", "museum.tt", "aero.tt", "name.tt", "gov.tt", "edu.tt", "tv", "tw", "edu.tw", "gov.tw", "mil.tw", "com.tw", "net.tw", "org.tw", "idv.tw", "game.tw", "ebiz.tw", "club.tw", "xn--zf0ao64a.tw", "xn--uc0atv.tw", "xn--czrw28b.tw", "ac.tz", "co.tz", "go.tz", "hotel.tz", "info.tz", "me.tz", "mil.tz", "mobi.tz", "ne.tz", "or.tz", "sc.tz", "tv.tz", "ua", "com.ua", "edu.ua", "gov.ua", "in.ua", "net.ua", "org.ua", "cherkassy.ua", "cherkasy.ua", "chernigov.ua", "chernihiv.ua", "chernivtsi.ua", "chernovtsy.ua", "ck.ua", "cn.ua", "cr.ua", "crimea.ua", "cv.ua", "dn.ua", "dnepropetrovsk.ua", "dnipropetrovsk.ua", "dominic.ua", "donetsk.ua", "dp.ua", "if.ua", "ivano-frankivsk.ua", "kh.ua", "kharkiv.ua", "kharkov.ua", "kherson.ua", "khmelnitskiy.ua", "khmelnytskyi.ua", "kiev.ua", "kirovograd.ua", "km.ua", "kr.ua", "krym.ua", "ks.ua", "kv.ua", "kyiv.ua", "lg.ua", "lt.ua", "lugansk.ua", "lutsk.ua", "lv.ua", "lviv.ua", "mk.ua", "mykolaiv.ua", "nikolaev.ua", "od.ua", "odesa.ua", "odessa.ua", "pl.ua", "poltava.ua", "rivne.ua", "rovno.ua", "rv.ua", "sb.ua", "sebastopol.ua", "sevastopol.ua", "sm.ua", "sumy.ua", "te.ua", "ternopil.ua", "uz.ua", "uzhgorod.ua", "vinnica.ua", "vinnytsia.ua", "vn.ua", "volyn.ua", "yalta.ua", "zaporizhzhe.ua", "zaporizhzhia.ua", "zhitomir.ua", "zhytomyr.ua", "zp.ua", "zt.ua", "co.ua", "pp.ua", "ug", "co.ug", "or.ug", "ac.ug", "sc.ug", "go.ug", "ne.ug", "com.ug", "org.ug", "*.uk", "*.sch.uk", "!bl.uk", "!british-library.uk", "!jet.uk", "!mod.uk", "!national-library-scotland.uk", "!nel.uk", "!nic.uk", "!nls.uk", "!parliament.uk", "us", "dni.us", "fed.us", "isa.us", "kids.us", "nsn.us", "ak.us", "al.us", "ar.us", "as.us", "az.us", "ca.us", "co.us", "ct.us", "dc.us", "de.us", "fl.us", "ga.us", "gu.us", "hi.us", "ia.us", "id.us", "il.us", "in.us", "ks.us", "ky.us", "la.us", "ma.us", "md.us", "me.us", "mi.us", "mn.us", "mo.us", "ms.us", "mt.us", "nc.us", "nd.us", "ne.us", "nh.us", "nj.us", "nm.us", "nv.us", "ny.us", "oh.us", "ok.us", "or.us", "pa.us", "pr.us", "ri.us", "sc.us", "sd.us", "tn.us", "tx.us", "ut.us", "vi.us", "vt.us", "va.us", "wa.us", "wi.us", "wv.us", "wy.us", "k12.ak.us", "k12.al.us", "k12.ar.us", "k12.as.us", "k12.az.us", "k12.ca.us", "k12.co.us", "k12.ct.us", "k12.dc.us", "k12.de.us", "k12.fl.us", "k12.ga.us", "k12.gu.us", "k12.ia.us", "k12.id.us", "k12.il.us", "k12.in.us", "k12.ks.us", "k12.ky.us", "k12.la.us", "k12.ma.us", "k12.md.us", "k12.me.us", "k12.mi.us", "k12.mn.us", "k12.mo.us", "k12.ms.us", "k12.mt.us", "k12.nc.us", "k12.nd.us", "k12.ne.us", "k12.nh.us", "k12.nj.us", "k12.nm.us", "k12.nv.us", "k12.ny.us", "k12.oh.us", "k12.ok.us", "k12.or.us", "k12.pa.us", "k12.pr.us", "k12.ri.us", "k12.sc.us", "k12.sd.us", "k12.tn.us", "k12.tx.us", "k12.ut.us", "k12.vi.us", "k12.vt.us", "k12.va.us", "k12.wa.us", "k12.wi.us", "k12.wv.us", "k12.wy.us", "cc.ak.us", "cc.al.us", "cc.ar.us", "cc.as.us", "cc.az.us", "cc.ca.us", "cc.co.us", "cc.ct.us", "cc.dc.us", "cc.de.us", "cc.fl.us", "cc.ga.us", "cc.gu.us", "cc.hi.us", "cc.ia.us", "cc.id.us", "cc.il.us", "cc.in.us", "cc.ks.us", "cc.ky.us", "cc.la.us", "cc.ma.us", "cc.md.us", "cc.me.us", "cc.mi.us", "cc.mn.us", "cc.mo.us", "cc.ms.us", "cc.mt.us", "cc.nc.us", "cc.nd.us", "cc.ne.us", "cc.nh.us", "cc.nj.us", "cc.nm.us", "cc.nv.us", "cc.ny.us", "cc.oh.us", "cc.ok.us", "cc.or.us", "cc.pa.us", "cc.pr.us", "cc.ri.us", "cc.sc.us", "cc.sd.us", "cc.tn.us", "cc.tx.us", "cc.ut.us", "cc.vi.us", "cc.vt.us", "cc.va.us", "cc.wa.us", "cc.wi.us", "cc.wv.us", "cc.wy.us", "lib.ak.us", "lib.al.us", "lib.ar.us", "lib.as.us", "lib.az.us", "lib.ca.us", "lib.co.us", "lib.ct.us", "lib.dc.us", "lib.de.us", "lib.fl.us", "lib.ga.us", "lib.gu.us", "lib.hi.us", "lib.ia.us", "lib.id.us", "lib.il.us", "lib.in.us", "lib.ks.us", "lib.ky.us", "lib.la.us", "lib.ma.us", "lib.md.us", "lib.me.us", "lib.mi.us", "lib.mn.us", "lib.mo.us", "lib.ms.us", "lib.mt.us", "lib.nc.us", "lib.nd.us", "lib.ne.us", "lib.nh.us", "lib.nj.us", "lib.nm.us", "lib.nv.us", "lib.ny.us", "lib.oh.us", "lib.ok.us", "lib.or.us", "lib.pa.us", "lib.pr.us", "lib.ri.us", "lib.sc.us", "lib.sd.us", "lib.tn.us", "lib.tx.us", "lib.ut.us", "lib.vi.us", "lib.vt.us", "lib.va.us", "lib.wa.us", "lib.wi.us", "lib.wv.us", "lib.wy.us", "pvt.k12.ma.us", "chtr.k12.ma.us", "paroch.k12.ma.us", "uy", "com.uy", "edu.uy", "gub.uy", "mil.uy", "net.uy", "org.uy", "uz", "co.uz", "com.uz", "net.uz", "org.uz", "va", "vc", "com.vc", "net.vc", "org.vc", "gov.vc", "mil.vc", "edu.vc", "ve", "co.ve", "com.ve", "e12.ve", "edu.ve", "gov.ve", "info.ve", "mil.ve", "net.ve", "org.ve", "web.ve", "vg", "vi", "co.vi", "com.vi", "k12.vi", "net.vi", "org.vi", "vn", "com.vn", "net.vn", "org.vn", "edu.vn", "gov.vn", "int.vn", "ac.vn", "biz.vn", "info.vn", "name.vn", "pro.vn", "health.vn", "vu", "wf", "ws", "com.ws", "net.ws", "org.ws", "gov.ws", "edu.ws", "yt", "xn--mgbaam7a8h", "xn--54b7fta0cc", "xn--fiqs8s", "xn--fiqz9s", "xn--lgbbat1ad8j", "xn--wgbh1c", "xn--node", "xn--j6w193g", "xn--h2brj9c", "xn--mgbbh1a71e", "xn--fpcrj9c3d", "xn--gecrj9c", "xn--s9brj9c", "xn--45brj9c", "xn--xkc2dl3a5ee0h", "xn--mgba3a4f16a", "xn--mgba3a4fra", "xn--mgbayh7gpa", "xn--3e0b707e", "xn--fzc2c9e2c", "xn--xkc2al3hye2a", "xn--mgbc0a9azcg", "xn--mgb9awbf", "xn--ygbi2ammx", "xn--90a3ac", "xn--p1ai", "xn--wgbl6a", "xn--mgberp4a5d4ar", "xn--mgberp4a5d4a87g", "xn--mgbqly7c0a67fbc", "xn--mgbqly7cvafr", "xn--ogbpf8fl", "xn--mgbtf8fl", "xn--yfro4i67o", "xn--clchc0ea0b2g2a9gcd", "xn--o3cw4h", "xn--pgbs0dh", "xn--kpry57d", "xn--kprw13d", "xn--nnx388a", "xn--j1amh", "xn--mgb2ddes", "xxx", "*.ye", "*.za", "*.zm", "*.zw", "xn--80asehdb", "xn--80aswg", "xn--ngbc5azd", "xn--unup4y", "xn--vhquv", "camera", "clothing", "lighting", "singles", "ventures", "voyage", "guru", "holdings", "equipment", "bike", "estate", "tattoo", "xn--3ds443g", "xn--fiq228c5hs", "land", "plumbing", "contractors", "sexy", "menu", "xn--rhqv96g", "uno", "gallery", "technology", "xn--3bst00m", "reviews", "guide", "xn--6qq986b3xl", "graphics", "construction", "onl", "xn--q9jyb4c", "diamonds", "kiwi", "enterprises", "today", "futbol", "photography", "tips", "directory", "kitchen", "xn--6frz82g", "kim", "xn--cg4bki", "monash", "wed", "pink", "ruhr", "buzz", "careers", "shoes", "xn--4gbrim", "career", "otsuka", "xn--fiq64b", "cloudfront.net", "compute.amazonaws.com", "us-east-1.amazonaws.com", "compute-1.amazonaws.com", "z-1.compute-1.amazonaws.com", "z-2.compute-1.amazonaws.com", "ap-northeast-1.compute.amazonaws.com", "ap-southeast-1.compute.amazonaws.com", "ap-southeast-2.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", "elasticbeanstalk.com", "elb.amazonaws.com", "s3.amazonaws.com", "s3-us-west-2.amazonaws.com", "s3-us-west-1.amazonaws.com", "s3-eu-west-1.amazonaws.com", "s3-ap-southeast-1.amazonaws.com", "s3-ap-southeast-2.amazonaws.com", "s3-ap-northeast-1.amazonaws.com", "s3-sa-east-1.amazonaws.com", "s3-us-gov-west-1.amazonaws.com", "s3-fips-us-gov-west-1.amazonaws.com", "s3-website-us-east-1.amazonaws.com", "s3-website-us-west-2.amazonaws.com", "s3-website-us-west-1.amazonaws.com", "s3-website-eu-west-1.amazonaws.com", "s3-website-ap-southeast-1.amazonaws.com", "s3-website-ap-southeast-2.amazonaws.com", "s3-website-ap-northeast-1.amazonaws.com", "s3-website-sa-east-1.amazonaws.com", "s3-website-us-gov-west-1.amazonaws.com", "betainabox.com", "ae.org", "ar.com", "br.com", "cn.com", "com.de", "de.com", "eu.com", "gb.com", "gb.net", "gr.com", "hu.com", "hu.net", "jp.net", "jpn.com", "kr.com", "no.com", "qc.com", "ru.com", "sa.com", "se.com", "se.net", "uk.com", "uk.net", "us.com", "us.org", "uy.com", "za.com", "c.la", "cloudcontrolled.com", "cloudcontrolapp.com", "co.ca", "co.nl", "co.no", "dreamhosters.com", "dyndns-at-home.com", "dyndns-at-work.com", "dyndns-blog.com", "dyndns-free.com", "dyndns-home.com", "dyndns-ip.com", "dyndns-mail.com", "dyndns-office.com", "dyndns-pics.com", "dyndns-remote.com", "dyndns-server.com", "dyndns-web.com", "dyndns-wiki.com", "dyndns-work.com", "dyndns.biz", "dyndns.info", "dyndns.org", "dyndns.tv", "at-band-camp.net", "ath.cx", "barrel-of-knowledge.info", "barrell-of-knowledge.info", "better-than.tv", "blogdns.com", "blogdns.net", "blogdns.org", "blogsite.org", "boldlygoingnowhere.org", "broke-it.net", "buyshouses.net", "cechire.com", "dnsalias.com", "dnsalias.net", "dnsalias.org", "dnsdojo.com", "dnsdojo.net", "dnsdojo.org", "does-it.net", "doesntexist.com", "doesntexist.org", "dontexist.com", "dontexist.net", "dontexist.org", "doomdns.com", "doomdns.org", "dvrdns.org", "dyn-o-saur.com", "dynalias.com", "dynalias.net", "dynalias.org", "dynathome.net", "dyndns.ws", "endofinternet.net", "endofinternet.org", "endoftheinternet.org", "est-a-la-maison.com", "est-a-la-masion.com", "est-le-patron.com", "est-mon-blogueur.com", "for-better.biz", "for-more.biz", "for-our.info", "for-some.biz", "for-the.biz", "forgot.her.name", "forgot.his.name", "from-ak.com", "from-al.com", "from-ar.com", "from-az.net", "from-ca.com", "from-co.net", "from-ct.com", "from-dc.com", "from-de.com", "from-fl.com", "from-ga.com", "from-hi.com", "from-ia.com", "from-id.com", "from-il.com", "from-in.com", "from-ks.com", "from-ky.com", "from-la.net", "from-ma.com", "from-md.com", "from-me.org", "from-mi.com", "from-mn.com", "from-mo.com", "from-ms.com", "from-mt.com", "from-nc.com", "from-nd.com", "from-ne.com", "from-nh.com", "from-nj.com", "from-nm.com", "from-nv.com", "from-ny.net", "from-oh.com", "from-ok.com", "from-or.com", "from-pa.com", "from-pr.com", "from-ri.com", "from-sc.com", "from-sd.com", "from-tn.com", "from-tx.com", "from-ut.com", "from-va.com", "from-vt.com", "from-wa.com", "from-wi.com", "from-wv.com", "from-wy.com", "ftpaccess.cc", "fuettertdasnetz.de", "game-host.org", "game-server.cc", "getmyip.com", "gets-it.net", "go.dyndns.org", "gotdns.com", "gotdns.org", "groks-the.info", "groks-this.info", "ham-radio-op.net", "here-for-more.info", "hobby-site.com", "hobby-site.org", "home.dyndns.org", "homedns.org", "homeftp.net", "homeftp.org", "homeip.net", "homelinux.com", "homelinux.net", "homelinux.org", "homeunix.com", "homeunix.net", "homeunix.org", "iamallama.com", "in-the-band.net", "is-a-anarchist.com", "is-a-blogger.com", "is-a-bookkeeper.com", "is-a-bruinsfan.org", "is-a-bulls-fan.com", "is-a-candidate.org", "is-a-caterer.com", "is-a-celticsfan.org", "is-a-chef.com", "is-a-chef.net", "is-a-chef.org", "is-a-conservative.com", "is-a-cpa.com", "is-a-cubicle-slave.com", "is-a-democrat.com", "is-a-designer.com", "is-a-doctor.com", "is-a-financialadvisor.com", "is-a-geek.com", "is-a-geek.net", "is-a-geek.org", "is-a-green.com", "is-a-guru.com", "is-a-hard-worker.com", "is-a-hunter.com", "is-a-knight.org", "is-a-landscaper.com", "is-a-lawyer.com", "is-a-liberal.com", "is-a-libertarian.com", "is-a-linux-user.org", "is-a-llama.com", "is-a-musician.com", "is-a-nascarfan.com", "is-a-nurse.com", "is-a-painter.com", "is-a-patsfan.org", "is-a-personaltrainer.com", "is-a-photographer.com", "is-a-player.com", "is-a-republican.com", "is-a-rockstar.com", "is-a-socialist.com", "is-a-soxfan.org", "is-a-student.com", "is-a-teacher.com", "is-a-techie.com", "is-a-therapist.com", "is-an-accountant.com", "is-an-actor.com", "is-an-actress.com", "is-an-anarchist.com", "is-an-artist.com", "is-an-engineer.com", "is-an-entertainer.com", "is-by.us", "is-certified.com", "is-found.org", "is-gone.com", "is-into-anime.com", "is-into-cars.com", "is-into-cartoons.com", "is-into-games.com", "is-leet.com", "is-lost.org", "is-not-certified.com", "is-saved.org", "is-slick.com", "is-uberleet.com", "is-very-bad.org", "is-very-evil.org", "is-very-good.org", "is-very-nice.org", "is-very-sweet.org", "is-with-theband.com", "isa-geek.com", "isa-geek.net", "isa-geek.org", "isa-hockeynut.com", "issmarterthanyou.com", "isteingeek.de", "istmein.de", "kicks-ass.net", "kicks-ass.org", "knowsitall.info", "land-4-sale.us", "lebtimnetz.de", "leitungsen.de", "likes-pie.com", "likescandy.com", "merseine.nu", "mine.nu", "misconfused.org", "mypets.ws", "myphotos.cc", "neat-url.com", "office-on-the.net", "on-the-web.tv", "podzone.net", "podzone.org", "readmyblog.org", "saves-the-whales.com", "scrapper-site.net", "scrapping.cc", "selfip.biz", "selfip.com", "selfip.info", "selfip.net", "selfip.org", "sells-for-less.com", "sells-for-u.com", "sells-it.net", "sellsyourhome.org", "servebbs.com", "servebbs.net", "servebbs.org", "serveftp.net", "serveftp.org", "servegame.org", "shacknet.nu", "simple-url.com", "space-to-rent.com", "stuff-4-sale.org", "stuff-4-sale.us", "teaches-yoga.com", "thruhere.net", "traeumtgerade.de", "webhop.biz", "webhop.info", "webhop.net", "webhop.org", "worse-than.tv", "writesthisblog.com", "a.ssl.fastly.net", "b.ssl.fastly.net", "global.ssl.fastly.net", "a.prod.fastly.net", "global.prod.fastly.net", "github.io", "ro.com", "appspot.com", "blogspot.be", "blogspot.bj", "blogspot.ca", "blogspot.cf", "blogspot.ch", "blogspot.co.at", "blogspot.co.il", "blogspot.co.nz", "blogspot.co.uk", "blogspot.com", "blogspot.com.ar", "blogspot.com.au", "blogspot.com.br", "blogspot.com.es", "blogspot.cv", "blogspot.cz", "blogspot.de", "blogspot.dk", "blogspot.fi", "blogspot.fr", "blogspot.gr", "blogspot.hk", "blogspot.hu", "blogspot.ie", "blogspot.in", "blogspot.it", "blogspot.jp", "blogspot.kr", "blogspot.mr", "blogspot.mx", "blogspot.nl", "blogspot.no", "blogspot.pt", "blogspot.re", "blogspot.ro", "blogspot.se", "blogspot.sg", "blogspot.sk", "blogspot.td", "blogspot.tw", "codespot.com", "googleapis.com", "googlecode.com", "herokuapp.com", "herokussl.com", "iki.fi", "biz.at", "info.at", "co.pl", "nyc.mn", "operaunite.com", "rhcloud.com", "priv.at", "za.net", "za.org", } var nodeLabels = [...]string{ "ac", "ad", "ae", "aero", "af", "ag", "ai", "al", "am", "an", "ao", "aq", "ar", "arpa", "as", "asia", "at", "au", "aw", "ax", "az", "ba", "bb", "bd", "be", "bf", "bg", "bh", "bi", "bike", "biz", "bj", "bm", "bn", "bo", "br", "bs", "bt", "buzz", "bw", "by", "bz", "ca", "camera", "career", "careers", "cat", "cc", "cd", "cf", "cg", "ch", "ci", "ck", "cl", "clothing", "cm", "cn", "co", "com", "construction", "contractors", "coop", "cr", "cu", "cv", "cw", "cx", "cy", "cz", "de", "diamonds", "directory", "dj", "dk", "dm", "do", "dz", "ec", "edu", "ee", "eg", "enterprises", "equipment", "er", "es", "estate", "et", "eu", "fi", "fj", "fk", "fm", "fo", "fr", "futbol", "ga", "gallery", "gd", "ge", "gf", "gg", "gh", "gi", "gl", "gm", "gn", "gov", "gp", "gq", "gr", "graphics", "gs", "gt", "gu", "guide", "guru", "gw", "gy", "hk", "hm", "hn", "holdings", "hr", "ht", "hu", "id", "ie", "il", "im", "in", "info", "int", "io", "iq", "ir", "is", "it", "je", "jm", "jo", "jobs", "jp", "ke", "kg", "kh", "ki", "kim", "kitchen", "kiwi", "km", "kn", "kp", "kr", "kw", "ky", "kz", "la", "land", "lb", "lc", "li", "lighting", "lk", "lr", "ls", "lt", "lu", "lv", "ly", "ma", "mc", "md", "me", "menu", "mg", "mh", "mil", "mk", "ml", "mm", "mn", "mo", "mobi", "monash", "mp", "mq", "mr", "ms", "mt", "mu", "museum", "mv", "mw", "mx", "my", "mz", "na", "name", "nc", "ne", "net", "nf", "ng", "ni", "nl", "no", "np", "nr", "nu", "nz", "om", "onl", "org", "otsuka", "pa", "pe", "pf", "pg", "ph", "photography", "pink", "pk", "pl", "plumbing", "pm", "pn", "post", "pr", "pro", "ps", "pt", "pw", "py", "qa", "re", "reviews", "ro", "rs", "ru", "ruhr", "rw", "sa", "sb", "sc", "sd", "se", "sexy", "sg", "sh", "shoes", "si", "singles", "sk", "sl", "sm", "sn", "so", "sr", "st", "su", "sv", "sx", "sy", "sz", "tattoo", "tc", "td", "technology", "tel", "tf", "tg", "th", "tips", "tj", "tk", "tl", "tm", "tn", "to", "today", "tr", "travel", "tt", "tv", "tw", "tz", "ua", "ug", "uk", "uno", "us", "uy", "uz", "va", "vc", "ve", "ventures", "vg", "vi", "vn", "voyage", "vu", "wed", "wf", "ws", "xn--3bst00m", "xn--3ds443g", "xn--3e0b707e", "xn--45brj9c", "xn--4gbrim", "xn--54b7fta0cc", "xn--6frz82g", "xn--6qq986b3xl", "xn--80asehdb", "xn--80aswg", "xn--90a3ac", "xn--cg4bki", "xn--clchc0ea0b2g2a9gcd", "xn--fiq228c5hs", "xn--fiq64b", "xn--fiqs8s", "xn--fiqz9s", "xn--fpcrj9c3d", "xn--fzc2c9e2c", "xn--gecrj9c", "xn--h2brj9c", "xn--j1amh", "xn--j6w193g", "xn--kprw13d", "xn--kpry57d", "xn--lgbbat1ad8j", "xn--mgb2ddes", "xn--mgb9awbf", "xn--mgba3a4f16a", "xn--mgba3a4fra", "xn--mgbaam7a8h", "xn--mgbayh7gpa", "xn--mgbbh1a71e", "xn--mgbc0a9azcg", "xn--mgberp4a5d4a87g", "xn--mgberp4a5d4ar", "xn--mgbqly7c0a67fbc", "xn--mgbqly7cvafr", "xn--mgbtf8fl", "xn--ngbc5azd", "xn--nnx388a", "xn--node", "xn--o3cw4h", "xn--ogbpf8fl", "xn--p1ai", "xn--pgbs0dh", "xn--q9jyb4c", "xn--rhqv96g", "xn--s9brj9c", "xn--unup4y", "xn--vhquv", "xn--wgbh1c", "xn--wgbl6a", "xn--xkc2al3hye2a", "xn--xkc2dl3a5ee0h", "xn--yfro4i67o", "xn--ygbi2ammx", "xxx", "ye", "yt", "za", "zm", "zw", "com", "edu", "gov", "mil", "net", "org", "nom", "ac", "co", "gov", "mil", "net", "org", "sch", "accident-investigation", "accident-prevention", "aerobatic", "aeroclub", "aerodrome", "agents", "air-surveillance", "air-traffic-control", "aircraft", "airline", "airport", "airtraffic", "ambulance", "amusement", "association", "author", "ballooning", "broker", "caa", "cargo", "catering", "certification", "championship", "charter", "civilaviation", "club", "conference", "consultant", "consulting", "control", "council", "crew", "design", "dgca", "educator", "emergency", "engine", "engineer", "entertainment", "equipment", "exchange", "express", "federation", "flight", "freight", "fuel", "gliding", "government", "groundhandling", "group", "hanggliding", "homebuilt", "insurance", "journal", "journalist", "leasing", "logistics", "magazine", "maintenance", "marketplace", "media", "microlight", "modelling", "navigation", "parachuting", "paragliding", "passenger-association", "pilot", "press", "production", "recreation", "repbody", "res", "research", "rotorcraft", "safety", "scientist", "services", "show", "skydiving", "software", "student", "taxi", "trader", "trading", "trainer", "union", "workinggroup", "works", "com", "edu", "gov", "net", "org", "co", "com", "net", "nom", "org", "com", "net", "off", "org", "com", "edu", "gov", "mil", "net", "org", "com", "edu", "net", "org", "co", "ed", "gv", "it", "og", "pb", "com", "edu", "gob", "int", "mil", "net", "org", "tur", "blogspot", "e164", "in-addr", "ip6", "iris", "uri", "urn", "gov", "ac", "biz", "co", "gv", "info", "or", "priv", "blogspot", "act", "asn", "com", "conf", "csiro", "edu", "gov", "id", "info", "net", "nsw", "nt", "org", "oz", "qld", "sa", "tas", "vic", "wa", "blogspot", "act", "nsw", "nt", "qld", "sa", "tas", "vic", "wa", "act", "nt", "qld", "sa", "tas", "vic", "wa", "com", "biz", "com", "edu", "gov", "info", "int", "mil", "name", "net", "org", "pp", "pro", "co", "com", "edu", "gov", "mil", "net", "org", "rs", "unbi", "unsa", "biz", "com", "edu", "gov", "info", "net", "org", "store", "ac", "blogspot", "gov", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "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", "com", "edu", "gov", "net", "org", "co", "com", "edu", "or", "org", "dyndns", "for-better", "for-more", "for-some", "for-the", "selfip", "webhop", "asso", "barreau", "blogspot", "gouv", "com", "edu", "gov", "net", "org", "com", "edu", "gob", "gov", "int", "mil", "net", "org", "tv", "adm", "adv", "agr", "am", "arq", "art", "ato", "b", "bio", "blog", "bmd", "cim", "cng", "cnt", "com", "coop", "ecn", "eco", "edu", "emp", "eng", "esp", "etc", "eti", "far", "flog", "fm", "fnd", "fot", "fst", "g12", "ggf", "gov", "imb", "ind", "inf", "jor", "jus", "leg", "lel", "mat", "med", "mil", "mus", "net", "nom", "not", "ntr", "odo", "org", "ppg", "pro", "psc", "psi", "qsl", "radio", "rec", "slg", "srv", "taxi", "teo", "tmp", "trd", "tur", "tv", "vet", "vlog", "wiki", "zlg", "blogspot", "com", "edu", "gov", "net", "org", "com", "edu", "gov", "net", "org", "co", "org", "com", "gov", "mil", "of", "com", "edu", "gov", "net", "org", "ab", "bc", "blogspot", "co", "gc", "mb", "nb", "nf", "nl", "ns", "nt", "nu", "on", "pe", "qc", "sk", "yk", "ftpaccess", "game-server", "myphotos", "scrapping", "gov", "blogspot", "blogspot", "ac", "asso", "co", "com", "ed", "edu", "go", "gouv", "int", "md", "net", "or", "org", "presse", "xn--aroport-bya", "www", "co", "gob", "gov", "mil", "gov", "ac", "ah", "bj", "com", "cq", "edu", "fj", "gd", "gov", "gs", "gx", "gz", "ha", "hb", "he", "hi", "hk", "hl", "hn", "jl", "js", "jx", "ln", "mil", "mo", "net", "nm", "nx", "org", "qh", "sc", "sd", "sh", "sn", "sx", "tj", "tw", "xj", "xn--55qx5d", "xn--io0a7i", "xn--od0alg", "xz", "yn", "zj", "arts", "com", "edu", "firm", "gov", "info", "int", "mil", "net", "nom", "org", "rec", "web", "amazonaws", "appspot", "ar", "betainabox", "blogdns", "blogspot", "br", "cechire", "cloudcontrolapp", "cloudcontrolled", "cn", "codespot", "de", "dnsalias", "dnsdojo", "doesntexist", "dontexist", "doomdns", "dreamhosters", "dyn-o-saur", "dynalias", "dyndns-at-home", "dyndns-at-work", "dyndns-blog", "dyndns-free", "dyndns-home", "dyndns-ip", "dyndns-mail", "dyndns-office", "dyndns-pics", "dyndns-remote", "dyndns-server", "dyndns-web", "dyndns-wiki", "dyndns-work", "elasticbeanstalk", "est-a-la-maison", "est-a-la-masion", "est-le-patron", "est-mon-blogueur", "eu", "from-ak", "from-al", "from-ar", "from-ca", "from-ct", "from-dc", "from-de", "from-fl", "from-ga", "from-hi", "from-ia", "from-id", "from-il", "from-in", "from-ks", "from-ky", "from-ma", "from-md", "from-mi", "from-mn", "from-mo", "from-ms", "from-mt", "from-nc", "from-nd", "from-ne", "from-nh", "from-nj", "from-nm", "from-nv", "from-oh", "from-ok", "from-or", "from-pa", "from-pr", "from-ri", "from-sc", "from-sd", "from-tn", "from-tx", "from-ut", "from-va", "from-vt", "from-wa", "from-wi", "from-wv", "from-wy", "gb", "getmyip", "googleapis", "googlecode", "gotdns", "gr", "herokuapp", "herokussl", "hobby-site", "homelinux", "homeunix", "hu", "iamallama", "is-a-anarchist", "is-a-blogger", "is-a-bookkeeper", "is-a-bulls-fan", "is-a-caterer", "is-a-chef", "is-a-conservative", "is-a-cpa", "is-a-cubicle-slave", "is-a-democrat", "is-a-designer", "is-a-doctor", "is-a-financialadvisor", "is-a-geek", "is-a-green", "is-a-guru", "is-a-hard-worker", "is-a-hunter", "is-a-landscaper", "is-a-lawyer", "is-a-liberal", "is-a-libertarian", "is-a-llama", "is-a-musician", "is-a-nascarfan", "is-a-nurse", "is-a-painter", "is-a-personaltrainer", "is-a-photographer", "is-a-player", "is-a-republican", "is-a-rockstar", "is-a-socialist", "is-a-student", "is-a-teacher", "is-a-techie", "is-a-therapist", "is-an-accountant", "is-an-actor", "is-an-actress", "is-an-anarchist", "is-an-artist", "is-an-engineer", "is-an-entertainer", "is-certified", "is-gone", "is-into-anime", "is-into-cars", "is-into-cartoons", "is-into-games", "is-leet", "is-not-certified", "is-slick", "is-uberleet", "is-with-theband", "isa-geek", "isa-hockeynut", "issmarterthanyou", "jpn", "kr", "likes-pie", "likescandy", "neat-url", "no", "operaunite", "qc", "rhcloud", "ro", "ru", "sa", "saves-the-whales", "se", "selfip", "sells-for-less", "sells-for-u", "servebbs", "simple-url", "space-to-rent", "teaches-yoga", "uk", "us", "uy", "writesthisblog", "za", "compute", "compute-1", "elb", "s3", "s3-ap-northeast-1", "s3-ap-southeast-1", "s3-ap-southeast-2", "s3-eu-west-1", "s3-fips-us-gov-west-1", "s3-sa-east-1", "s3-us-gov-west-1", "s3-us-west-1", "s3-us-west-2", "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-gov-west-1", "s3-website-us-west-1", "s3-website-us-west-2", "us-east-1", "ap-northeast-1", "ap-southeast-1", "ap-southeast-2", "eu-west-1", "sa-east-1", "us-gov-west-1", "us-west-1", "us-west-2", "z-1", "z-2", "ac", "co", "ed", "fi", "go", "or", "sa", "com", "edu", "gov", "inf", "net", "org", "blogspot", "com", "edu", "net", "org", "ath", "gov", "blogspot", "blogspot", "com", "fuettertdasnetz", "isteingeek", "istmein", "lebtimnetz", "leitungsen", "traeumtgerade", "blogspot", "com", "edu", "gov", "net", "org", "art", "com", "edu", "gob", "gov", "mil", "net", "org", "sld", "web", "art", "asso", "com", "edu", "gov", "net", "org", "pol", "com", "edu", "fin", "gob", "gov", "info", "k12", "med", "mil", "net", "org", "pro", "aip", "com", "edu", "fie", "gov", "lib", "med", "org", "pri", "riik", "com", "edu", "eun", "gov", "mil", "name", "net", "org", "sci", "com", "edu", "gob", "nom", "org", "blogspot", "aland", "blogspot", "iki", "aeroport", "assedic", "asso", "avocat", "avoues", "blogspot", "cci", "chambagri", "chirurgiens-dentistes", "com", "experts-comptables", "geometre-expert", "gouv", "greta", "huissier-justice", "medecin", "nom", "notaires", "pharmacien", "port", "prd", "presse", "tm", "veterinaire", "com", "edu", "gov", "mil", "net", "org", "pvt", "co", "gov", "net", "org", "sch", "com", "edu", "gov", "mil", "org", "com", "edu", "gov", "ltd", "mod", "org", "ac", "com", "edu", "gov", "net", "org", "asso", "com", "edu", "mobi", "net", "org", "blogspot", "com", "edu", "gov", "net", "org", "com", "edu", "gob", "ind", "mil", "net", "org", "co", "com", "net", "blogspot", "com", "edu", "gov", "idv", "net", "org", "xn--55qx5d", "xn--ciqpn", "xn--gmq050i", "xn--gmqw5a", "xn--io0a7i", "xn--lcvr32d", "xn--mk0axi", "xn--mxtq1m", "xn--od0alg", "xn--od0aq3b", "xn--tn0ag", "xn--uc0atv", "xn--uc0ay4a", "xn--wcvs22d", "xn--zf0avx", "com", "edu", "gob", "mil", "net", "org", "com", "from", "iz", "name", "adult", "art", "asso", "com", "coop", "edu", "firm", "gouv", "info", "med", "net", "org", "perso", "pol", "pro", "rel", "shop", "2000", "agrar", "blogspot", "bolt", "casino", "city", "co", "erotica", "erotika", "film", "forum", "games", "hotel", "info", "ingatlan", "jogasz", "konyvelo", "lakas", "media", "news", "org", "priv", "reklam", "sex", "shop", "sport", "suli", "szex", "tm", "tozsde", "utazas", "video", "ac", "biz", "co", "go", "mil", "my", "net", "or", "sch", "web", "blogspot", "gov", "co", "blogspot", "ac", "co", "gov", "net", "nic", "org", "ltd", "plc", "ac", "blogspot", "co", "edu", "firm", "gen", "gov", "ind", "mil", "net", "nic", "org", "res", "barrel-of-knowledge", "barrell-of-knowledge", "dyndns", "for-our", "groks-the", "groks-this", "here-for-more", "knowsitall", "selfip", "webhop", "eu", "com", "github", "com", "edu", "gov", "mil", "net", "org", "ac", "co", "gov", "id", "net", "org", "sch", "xn--mgba3a4f16a", "xn--mgba3a4fra", "com", "edu", "gov", "int", "net", "org", "ag", "agrigento", "al", "alessandria", "alto-adige", "altoadige", "an", "ancona", "andria-barletta-trani", "andria-trani-barletta", "andriabarlettatrani", "andriatranibarletta", "ao", "aosta", "aoste", "ap", "aq", "aquila", "ar", "arezzo", "ascoli-piceno", "ascolipiceno", "asti", "at", "av", "avellino", "ba", "balsan", "bari", "barletta-trani-andria", "barlettatraniandria", "belluno", "benevento", "bergamo", "bg", "bi", "biella", "bl", "blogspot", "bn", "bo", "bologna", "bolzano", "bozen", "br", "brescia", "brindisi", "bs", "bt", "bz", "ca", "cagliari", "caltanissetta", "campidano-medio", "campidanomedio", "campobasso", "carbonia-iglesias", "carboniaiglesias", "carrara-massa", "carraramassa", "caserta", "catania", "catanzaro", "cb", "ce", "cesena-forli", "cesenaforli", "ch", "chieti", "ci", "cl", "cn", "co", "como", "cosenza", "cr", "cremona", "crotone", "cs", "ct", "cuneo", "cz", "dell-ogliastra", "dellogliastra", "edu", "en", "enna", "fc", "fe", "fermo", "ferrara", "fg", "fi", "firenze", "florence", "fm", "foggia", "forli-cesena", "forlicesena", "fr", "frosinone", "ge", "genoa", "genova", "go", "gorizia", "gov", "gr", "grosseto", "iglesias-carbonia", "iglesiascarbonia", "im", "imperia", "is", "isernia", "kr", "la-spezia", "laquila", "laspezia", "latina", "lc", "le", "lecce", "lecco", "li", "livorno", "lo", "lodi", "lt", "lu", "lucca", "macerata", "mantova", "massa-carrara", "massacarrara", "matera", "mb", "mc", "me", "medio-campidano", "mediocampidano", "messina", "mi", "milan", "milano", "mn", "mo", "modena", "monza", "monza-brianza", "monza-e-della-brianza", "monzabrianza", "monzaebrianza", "monzaedellabrianza", "ms", "mt", "na", "naples", "napoli", "no", "novara", "nu", "nuoro", "og", "ogliastra", "olbia-tempio", "olbiatempio", "or", "oristano", "ot", "pa", "padova", "padua", "palermo", "parma", "pavia", "pc", "pd", "pe", "perugia", "pesaro-urbino", "pesarourbino", "pescara", "pg", "pi", "piacenza", "pisa", "pistoia", "pn", "po", "pordenone", "potenza", "pr", "prato", "pt", "pu", "pv", "pz", "ra", "ragusa", "ravenna", "rc", "re", "reggio-calabria", "reggio-emilia", "reggiocalabria", "reggioemilia", "rg", "ri", "rieti", "rimini", "rm", "rn", "ro", "roma", "rome", "rovigo", "sa", "salerno", "sassari", "savona", "si", "siena", "siracusa", "so", "sondrio", "sp", "sr", "ss", "suedtirol", "sv", "ta", "taranto", "te", "tempio-olbia", "tempioolbia", "teramo", "terni", "tn", "to", "torino", "tp", "tr", "trani-andria-barletta", "trani-barletta-andria", "traniandriabarletta", "tranibarlettaandria", "trapani", "trentino", "trento", "treviso", "trieste", "ts", "turin", "tv", "ud", "udine", "urbino-pesaro", "urbinopesaro", "va", "varese", "vb", "vc", "ve", "venezia", "venice", "verbania", "vercelli", "verona", "vi", "vibo-valentia", "vibovalentia", "vicenza", "viterbo", "vr", "vs", "vt", "vv", "co", "gov", "net", "org", "sch", "com", "edu", "gov", "mil", "name", "net", "org", "sch", "ac", "ad", "aichi", "akita", "aomori", "blogspot", "chiba", "co", "ed", "ehime", "fukui", "fukuoka", "fukushima", "gifu", "go", "gr", "gunma", "hiroshima", "hokkaido", "hyogo", "ibaraki", "ishikawa", "iwate", "kagawa", "kagoshima", "kanagawa", "kawasaki", "kitakyushu", "kobe", "kochi", "kumamoto", "kyoto", "lg", "mie", "miyagi", "miyazaki", "nagano", "nagasaki", "nagoya", "nara", "ne", "niigata", "oita", "okayama", "okinawa", "or", "osaka", "saga", "saitama", "sapporo", "sendai", "shiga", "shimane", "shizuoka", "tochigi", "tokushima", "tokyo", "tottori", "toyama", "wakayama", "yamagata", "yamaguchi", "yamanashi", "yokohama", "aisai", "ama", "anjo", "asuke", "chiryu", "chita", "fuso", "gamagori", "handa", "hazu", "hekinan", "higashiura", "ichinomiya", "inazawa", "inuyama", "isshiki", "iwakura", "kanie", "kariya", "kasugai", "kira", "kiyosu", "komaki", "konan", "kota", "mihama", "miyoshi", "nagakute", "nishio", "nisshin", "obu", "oguchi", "oharu", "okazaki", "owariasahi", "seto", "shikatsu", "shinshiro", "shitara", "tahara", "takahama", "tobishima", "toei", "togo", "tokai", "tokoname", "toyoake", "toyohashi", "toyokawa", "toyone", "toyota", "tsushima", "yatomi", "akita", "daisen", "fujisato", "gojome", "hachirogata", "happou", "higashinaruse", "honjo", "honjyo", "ikawa", "kamikoani", "kamioka", "katagami", "kazuno", "kitaakita", "kosaka", "kyowa", "misato", "mitane", "moriyoshi", "nikaho", "noshiro", "odate", "oga", "ogata", "semboku", "yokote", "yurihonjo", "aomori", "gonohe", "hachinohe", "hashikami", "hiranai", "hirosaki", "itayanagi", "kuroishi", "misawa", "mutsu", "nakadomari", "noheji", "oirase", "owani", "rokunohe", "sannohe", "shichinohe", "shingo", "takko", "towada", "tsugaru", "tsuruta", "abiko", "asahi", "chonan", "chosei", "choshi", "chuo", "funabashi", "futtsu", "hanamigawa", "ichihara", "ichikawa", "ichinomiya", "inzai", "isumi", "kamagaya", "kamogawa", "kashiwa", "katori", "katsuura", "kimitsu", "kisarazu", "kozaki", "kujukuri", "kyonan", "matsudo", "midori", "mihama", "minamiboso", "mobara", "mutsuzawa", "nagara", "nagareyama", "narashino", "narita", "noda", "oamishirasato", "omigawa", "onjuku", "otaki", "sakae", "sakura", "shimofusa", "shirako", "shiroi", "shisui", "sodegaura", "sosa", "tako", "tateyama", "togane", "tohnosho", "tomisato", "urayasu", "yachimata", "yachiyo", "yokaichiba", "yokoshibahikari", "yotsukaido", "ainan", "honai", "ikata", "imabari", "iyo", "kamijima", "kihoku", "kumakogen", "masaki", "matsuno", "matsuyama", "namikata", "niihama", "ozu", "saijo", "seiyo", "shikokuchuo", "tobe", "toon", "uchiko", "uwajima", "yawatahama", "echizen", "eiheiji", "fukui", "ikeda", "katsuyama", "mihama", "minamiechizen", "obama", "ohi", "ono", "sabae", "sakai", "takahama", "tsuruga", "wakasa", "ashiya", "buzen", "chikugo", "chikuho", "chikujo", "chikushino", "chikuzen", "chuo", "dazaifu", "fukuchi", "hakata", "higashi", "hirokawa", "hisayama", "iizuka", "inatsuki", "kaho", "kasuga", "kasuya", "kawara", "keisen", "koga", "kurate", "kurogi", "kurume", "minami", "miyako", "miyama", "miyawaka", "mizumaki", "munakata", "nakagawa", "nakama", "nishi", "nogata", "ogori", "okagaki", "okawa", "oki", "omuta", "onga", "onojo", "oto", "saigawa", "sasaguri", "shingu", "shinyoshitomi", "shonai", "soeda", "sue", "tachiarai", "tagawa", "takata", "toho", "toyotsu", "tsuiki", "ukiha", "umi", "usui", "yamada", "yame", "yanagawa", "yukuhashi", "aizubange", "aizumisato", "aizuwakamatsu", "asakawa", "bandai", "date", "fukushima", "furudono", "futaba", "hanawa", "higashi", "hirata", "hirono", "iitate", "inawashiro", "ishikawa", "iwaki", "izumizaki", "kagamiishi", "kaneyama", "kawamata", "kitakata", "kitashiobara", "koori", "koriyama", "kunimi", "miharu", "mishima", "namie", "nango", "nishiaizu", "nishigo", "okuma", "omotego", "ono", "otama", "samegawa", "shimogo", "shirakawa", "showa", "soma", "sukagawa", "taishin", "tamakawa", "tanagura", "tenei", "yabuki", "yamato", "yamatsuri", "yanaizu", "yugawa", "anpachi", "ena", "gifu", "ginan", "godo", "gujo", "hashima", "hichiso", "hida", "higashishirakawa", "ibigawa", "ikeda", "kakamigahara", "kani", "kasahara", "kasamatsu", "kawaue", "kitagata", "mino", "minokamo", "mitake", "mizunami", "motosu", "nakatsugawa", "ogaki", "sakahogi", "seki", "sekigahara", "shirakawa", "tajimi", "takayama", "tarui", "toki", "tomika", "wanouchi", "yamagata", "yaotsu", "yoro", "annaka", "chiyoda", "fujioka", "higashiagatsuma", "isesaki", "itakura", "kanna", "kanra", "katashina", "kawaba", "kiryu", "kusatsu", "maebashi", "meiwa", "midori", "minakami", "naganohara", "nakanojo", "nanmoku", "numata", "oizumi", "ora", "ota", "shibukawa", "shimonita", "shinto", "showa", "takasaki", "takayama", "tamamura", "tatebayashi", "tomioka", "tsukiyono", "tsumagoi", "ueno", "yoshioka", "asaminami", "daiwa", "etajima", "fuchu", "fukuyama", "hatsukaichi", "higashihiroshima", "hongo", "jinsekikogen", "kaita", "kui", "kumano", "kure", "mihara", "miyoshi", "naka", "onomichi", "osakikamijima", "otake", "saka", "sera", "seranishi", "shinichi", "shobara", "takehara", "abashiri", "abira", "aibetsu", "akabira", "akkeshi", "asahikawa", "ashibetsu", "ashoro", "assabu", "atsuma", "bibai", "biei", "bifuka", "bihoro", "biratori", "chippubetsu", "chitose", "date", "ebetsu", "embetsu", "eniwa", "erimo", "esan", "esashi", "fukagawa", "fukushima", "furano", "furubira", "haboro", "hakodate", "hamatonbetsu", "hidaka", "higashikagura", "higashikawa", "hiroo", "hokuryu", "hokuto", "honbetsu", "horokanai", "horonobe", "ikeda", "imakane", "ishikari", "iwamizawa", "iwanai", "kamifurano", "kamikawa", "kamishihoro", "kamisunagawa", "kamoenai", "kayabe", "kembuchi", "kikonai", "kimobetsu", "kitahiroshima", "kitami", "kiyosato", "koshimizu", "kunneppu", "kuriyama", "kuromatsunai", "kushiro", "kutchan", "kyowa", "mashike", "matsumae", "mikasa", "minamifurano", "mombetsu", "moseushi", "mukawa", "muroran", "naie", "nakagawa", "nakasatsunai", "nakatombetsu", "nanae", "nanporo", "nayoro", "nemuro", "niikappu", "niki", "nishiokoppe", "noboribetsu", "numata", "obihiro", "obira", "oketo", "okoppe", "otaru", "otobe", "otofuke", "otoineppu", "oumu", "ozora", "pippu", "rankoshi", "rebun", "rikubetsu", "rishiri", "rishirifuji", "saroma", "sarufutsu", "shakotan", "shari", "shibecha", "shibetsu", "shikabe", "shikaoi", "shimamaki", "shimizu", "shimokawa", "shinshinotsu", "shintoku", "shiranuka", "shiraoi", "shiriuchi", "sobetsu", "sunagawa", "taiki", "takasu", "takikawa", "takinoue", "teshikaga", "tobetsu", "tohma", "tomakomai", "tomari", "toya", "toyako", "toyotomi", "toyoura", "tsubetsu", "tsukigata", "urakawa", "urausu", "uryu", "utashinai", "wakkanai", "wassamu", "yakumo", "yoichi", "aioi", "akashi", "ako", "amagasaki", "aogaki", "asago", "ashiya", "awaji", "fukusaki", "goshiki", "harima", "himeji", "ichikawa", "inagawa", "itami", "kakogawa", "kamigori", "kamikawa", "kasai", "kasuga", "kawanishi", "miki", "minamiawaji", "nishinomiya", "nishiwaki", "ono", "sanda", "sannan", "sasayama", "sayo", "shingu", "shinonsen", "shiso", "sumoto", "taishi", "taka", "takarazuka", "takasago", "takino", "tamba", "tatsuno", "toyooka", "yabu", "yashiro", "yoka", "yokawa", "ami", "asahi", "bando", "chikusei", "daigo", "fujishiro", "hitachi", "hitachinaka", "hitachiomiya", "hitachiota", "ibaraki", "ina", "inashiki", "itako", "iwama", "joso", "kamisu", "kasama", "kashima", "kasumigaura", "koga", "miho", "mito", "moriya", "naka", "namegata", "oarai", "ogawa", "omitama", "ryugasaki", "sakai", "sakuragawa", "shimodate", "shimotsuma", "shirosato", "sowa", "suifu", "takahagi", "tamatsukuri", "tokai", "tomobe", "tone", "toride", "tsuchiura", "tsukuba", "uchihara", "ushiku", "yachiyo", "yamagata", "yawara", "yuki", "anamizu", "hakui", "hakusan", "kaga", "kahoku", "kanazawa", "kawakita", "komatsu", "nakanoto", "nanao", "nomi", "nonoichi", "noto", "shika", "suzu", "tsubata", "tsurugi", "uchinada", "wajima", "fudai", "fujisawa", "hanamaki", "hiraizumi", "hirono", "ichinohe", "ichinoseki", "iwaizumi", "iwate", "joboji", "kamaishi", "kanegasaki", "karumai", "kawai", "kitakami", "kuji", "kunohe", "kuzumaki", "miyako", "mizusawa", "morioka", "ninohe", "noda", "ofunato", "oshu", "otsuchi", "rikuzentakata", "shiwa", "shizukuishi", "sumita", "takizawa", "tanohata", "tono", "yahaba", "yamada", "ayagawa", "higashikagawa", "kanonji", "kotohira", "manno", "marugame", "mitoyo", "naoshima", "sanuki", "tadotsu", "takamatsu", "tonosho", "uchinomi", "utazu", "zentsuji", "akune", "amami", "hioki", "isa", "isen", "izumi", "kagoshima", "kanoya", "kawanabe", "kinko", "kouyama", "makurazaki", "matsumoto", "minamitane", "nakatane", "nishinoomote", "satsumasendai", "soo", "tarumizu", "yusui", "aikawa", "atsugi", "ayase", "chigasaki", "ebina", "fujisawa", "hadano", "hakone", "hiratsuka", "isehara", "kaisei", "kamakura", "kiyokawa", "matsuda", "minamiashigara", "miura", "nakai", "ninomiya", "odawara", "oi", "oiso", "sagamihara", "samukawa", "tsukui", "yamakita", "yamato", "yokosuka", "yugawara", "zama", "zushi", "city", "city", "city", "aki", "geisei", "hidaka", "higashitsuno", "ino", "kagami", "kami", "kitagawa", "kochi", "mihara", "motoyama", "muroto", "nahari", "nakamura", "nankoku", "nishitosa", "niyodogawa", "ochi", "okawa", "otoyo", "otsuki", "sakawa", "sukumo", "susaki", "tosa", "tosashimizu", "toyo", "tsuno", "umaji", "yasuda", "yusuhara", "amakusa", "arao", "aso", "choyo", "gyokuto", "hitoyoshi", "kamiamakusa", "kashima", "kikuchi", "kosa", "kumamoto", "mashiki", "mifune", "minamata", "minamioguni", "nagasu", "nishihara", "oguni", "ozu", "sumoto", "takamori", "uki", "uto", "yamaga", "yamato", "yatsushiro", "ayabe", "fukuchiyama", "higashiyama", "ide", "ine", "joyo", "kameoka", "kamo", "kita", "kizu", "kumiyama", "kyotamba", "kyotanabe", "kyotango", "maizuru", "minami", "minamiyamashiro", "miyazu", "muko", "nagaokakyo", "nakagyo", "nantan", "oyamazaki", "sakyo", "seika", "tanabe", "uji", "ujitawara", "wazuka", "yamashina", "yawata", "asahi", "inabe", "ise", "kameyama", "kawagoe", "kiho", "kisosaki", "kiwa", "komono", "kumano", "kuwana", "matsusaka", "meiwa", "mihama", "minamiise", "misugi", "miyama", "nabari", "shima", "suzuka", "tado", "taiki", "taki", "tamaki", "toba", "tsu", "udono", "ureshino", "watarai", "yokkaichi", "furukawa", "higashimatsushima", "ishinomaki", "iwanuma", "kakuda", "kami", "kawasaki", "kesennuma", "marumori", "matsushima", "minamisanriku", "misato", "murata", "natori", "ogawara", "ohira", "onagawa", "osaki", "rifu", "semine", "shibata", "shichikashuku", "shikama", "shiogama", "shiroishi", "tagajo", "taiwa", "tome", "tomiya", "wakuya", "watari", "yamamoto", "zao", "aya", "ebino", "gokase", "hyuga", "kadogawa", "kawaminami", "kijo", "kitagawa", "kitakata", "kitaura", "kobayashi", "kunitomi", "kushima", "mimata", "miyakonojo", "miyazaki", "morotsuka", "nichinan", "nishimera", "nobeoka", "saito", "shiiba", "shintomi", "takaharu", "takanabe", "takazaki", "tsuno", "achi", "agematsu", "anan", "aoki", "asahi", "azumino", "chikuhoku", "chikuma", "chino", "fujimi", "hakuba", "hara", "hiraya", "iida", "iijima", "iiyama", "iizuna", "ikeda", "ikusaka", "ina", "karuizawa", "kawakami", "kiso", "kisofukushima", "kitaaiki", "komagane", "komoro", "matsukawa", "matsumoto", "miasa", "minamiaiki", "minamimaki", "minamiminowa", "minowa", "miyada", "miyota", "mochizuki", "nagano", "nagawa", "nagiso", "nakagawa", "nakano", "nozawaonsen", "obuse", "ogawa", "okaya", "omachi", "omi", "ookuwa", "ooshika", "otaki", "otari", "sakae", "sakaki", "saku", "sakuho", "shimosuwa", "shinanomachi", "shiojiri", "suwa", "suzaka", "takagi", "takamori", "takayama", "tateshina", "tatsuno", "togakushi", "togura", "tomi", "ueda", "wada", "yamagata", "yamanouchi", "yasaka", "yasuoka", "chijiwa", "futsu", "goto", "hasami", "hirado", "iki", "isahaya", "kawatana", "kuchinotsu", "matsuura", "nagasaki", "obama", "omura", "oseto", "saikai", "sasebo", "seihi", "shimabara", "shinkamigoto", "togitsu", "tsushima", "unzen", "city", "ando", "gose", "heguri", "higashiyoshino", "ikaruga", "ikoma", "kamikitayama", "kanmaki", "kashiba", "kashihara", "katsuragi", "kawai", "kawakami", "kawanishi", "koryo", "kurotaki", "mitsue", "miyake", "nara", "nosegawa", "oji", "ouda", "oyodo", "sakurai", "sango", "shimoichi", "shimokitayama", "shinjo", "soni", "takatori", "tawaramoto", "tenkawa", "tenri", "uda", "yamatokoriyama", "yamatotakada", "yamazoe", "yoshino", "aga", "agano", "gosen", "itoigawa", "izumozaki", "joetsu", "kamo", "kariwa", "kashiwazaki", "minamiuonuma", "mitsuke", "muika", "murakami", "myoko", "nagaoka", "niigata", "ojiya", "omi", "sado", "sanjo", "seiro", "seirou", "sekikawa", "shibata", "tagami", "tainai", "tochio", "tokamachi", "tsubame", "tsunan", "uonuma", "yahiko", "yoita", "yuzawa", "beppu", "bungoono", "bungotakada", "hasama", "hiji", "himeshima", "hita", "kamitsue", "kokonoe", "kuju", "kunisaki", "kusu", "oita", "saiki", "taketa", "tsukumi", "usa", "usuki", "yufu", "akaiwa", "asakuchi", "bizen", "hayashima", "ibara", "kagamino", "kasaoka", "kibichuo", "kumenan", "kurashiki", "maniwa", "misaki", "nagi", "niimi", "nishiawakura", "okayama", "satosho", "setouchi", "shinjo", "shoo", "soja", "takahashi", "tamano", "tsuyama", "wake", "yakage", "aguni", "ginowan", "ginoza", "gushikami", "haebaru", "higashi", "hirara", "iheya", "ishigaki", "ishikawa", "itoman", "izena", "kadena", "kin", "kitadaito", "kitanakagusuku", "kumejima", "kunigami", "minamidaito", "motobu", "nago", "naha", "nakagusuku", "nakijin", "nanjo", "nishihara", "ogimi", "okinawa", "onna", "shimoji", "taketomi", "tarama", "tokashiki", "tomigusuku", "tonaki", "urasoe", "uruma", "yaese", "yomitan", "yonabaru", "yonaguni", "zamami", "abeno", "chihayaakasaka", "chuo", "daito", "fujiidera", "habikino", "hannan", "higashiosaka", "higashisumiyoshi", "higashiyodogawa", "hirakata", "ibaraki", "ikeda", "izumi", "izumiotsu", "izumisano", "kadoma", "kaizuka", "kanan", "kashiwara", "katano", "kawachinagano", "kishiwada", "kita", "kumatori", "matsubara", "minato", "minoh", "misaki", "moriguchi", "neyagawa", "nishi", "nose", "osakasayama", "sakai", "sayama", "sennan", "settsu", "shijonawate", "shimamoto", "suita", "tadaoka", "taishi", "tajiri", "takaishi", "takatsuki", "tondabayashi", "toyonaka", "toyono", "yao", "ariake", "arita", "fukudomi", "genkai", "hamatama", "hizen", "imari", "kamimine", "kanzaki", "karatsu", "kashima", "kitagata", "kitahata", "kiyama", "kouhoku", "kyuragi", "nishiarita", "ogi", "omachi", "ouchi", "saga", "shiroishi", "taku", "tara", "tosu", "yoshinogari", "arakawa", "asaka", "chichibu", "fujimi", "fujimino", "fukaya", "hanno", "hanyu", "hasuda", "hatogaya", "hatoyama", "hidaka", "higashichichibu", "higashimatsuyama", "honjo", "ina", "iruma", "iwatsuki", "kamiizumi", "kamikawa", "kamisato", "kasukabe", "kawagoe", "kawaguchi", "kawajima", "kazo", "kitamoto", "koshigaya", "kounosu", "kuki", "kumagaya", "matsubushi", "minano", "misato", "miyashiro", "miyoshi", "moroyama", "nagatoro", "namegawa", "niiza", "ogano", "ogawa", "ogose", "okegawa", "omiya", "otaki", "ranzan", "ryokami", "saitama", "sakado", "satte", "sayama", "shiki", "shiraoka", "soka", "sugito", "toda", "tokigawa", "tokorozawa", "tsurugashima", "urawa", "warabi", "yashio", "yokoze", "yono", "yorii", "yoshida", "yoshikawa", "yoshimi", "city", "city", "aisho", "gamo", "higashiomi", "hikone", "koka", "konan", "kosei", "koto", "kusatsu", "maibara", "moriyama", "nagahama", "nishiazai", "notogawa", "omihachiman", "otsu", "ritto", "ryuoh", "takashima", "takatsuki", "torahime", "toyosato", "yasu", "akagi", "ama", "gotsu", "hamada", "higashiizumo", "hikawa", "hikimi", "izumo", "kakinoki", "masuda", "matsue", "misato", "nishinoshima", "ohda", "okinoshima", "okuizumo", "shimane", "tamayu", "tsuwano", "unnan", "yakumo", "yasugi", "yatsuka", "arai", "atami", "fuji", "fujieda", "fujikawa", "fujinomiya", "fukuroi", "gotemba", "haibara", "hamamatsu", "higashiizu", "ito", "iwata", "izu", "izunokuni", "kakegawa", "kannami", "kawanehon", "kawazu", "kikugawa", "kosai", "makinohara", "matsuzaki", "minamiizu", "mishima", "morimachi", "nishiizu", "numazu", "omaezaki", "shimada", "shimizu", "shimoda", "shizuoka", "susono", "yaizu", "yoshida", "ashikaga", "bato", "haga", "ichikai", "iwafune", "kaminokawa", "kanuma", "karasuyama", "kuroiso", "mashiko", "mibu", "moka", "motegi", "nasu", "nasushiobara", "nikko", "nishikata", "nogi", "ohira", "ohtawara", "oyama", "sakura", "sano", "shimotsuke", "shioya", "takanezawa", "tochigi", "tsuga", "ujiie", "utsunomiya", "yaita", "aizumi", "anan", "ichiba", "itano", "kainan", "komatsushima", "matsushige", "mima", "minami", "miyoshi", "mugi", "nakagawa", "naruto", "sanagochi", "shishikui", "tokushima", "wajiki", "adachi", "akiruno", "akishima", "aogashima", "arakawa", "bunkyo", "chiyoda", "chofu", "chuo", "edogawa", "fuchu", "fussa", "hachijo", "hachioji", "hamura", "higashikurume", "higashimurayama", "higashiyamato", "hino", "hinode", "hinohara", "inagi", "itabashi", "katsushika", "kita", "kiyose", "kodaira", "koganei", "kokubunji", "komae", "koto", "kouzushima", "kunitachi", "machida", "meguro", "minato", "mitaka", "mizuho", "musashimurayama", "musashino", "nakano", "nerima", "ogasawara", "okutama", "ome", "oshima", "ota", "setagaya", "shibuya", "shinagawa", "shinjuku", "suginami", "sumida", "tachikawa", "taito", "tama", "toshima", "chizu", "hino", "kawahara", "koge", "kotoura", "misasa", "nanbu", "nichinan", "sakaiminato", "tottori", "wakasa", "yazu", "yonago", "asahi", "fuchu", "fukumitsu", "funahashi", "himi", "imizu", "inami", "johana", "kamiichi", "kurobe", "nakaniikawa", "namerikawa", "nanto", "nyuzen", "oyabe", "taira", "takaoka", "tateyama", "toga", "tonami", "toyama", "unazuki", "uozu", "yamada", "arida", "aridagawa", "gobo", "hashimoto", "hidaka", "hirogawa", "inami", "iwade", "kainan", "kamitonda", "katsuragi", "kimino", "kinokawa", "kitayama", "koya", "koza", "kozagawa", "kudoyama", "kushimoto", "mihama", "misato", "nachikatsuura", "shingu", "shirahama", "taiji", "tanabe", "wakayama", "yuasa", "yura", "asahi", "funagata", "higashine", "iide", "kahoku", "kaminoyama", "kaneyama", "kawanishi", "mamurogawa", "mikawa", "murayama", "nagai", "nakayama", "nanyo", "nishikawa", "obanazawa", "oe", "oguni", "ohkura", "oishida", "sagae", "sakata", "sakegawa", "shinjo", "shirataka", "shonai", "takahata", "tendo", "tozawa", "tsuruoka", "yamagata", "yamanobe", "yonezawa", "yuza", "abu", "hagi", "hikari", "hofu", "iwakuni", "kudamatsu", "mitou", "nagato", "oshima", "shimonoseki", "shunan", "tabuse", "tokuyama", "toyota", "ube", "yuu", "chuo", "doshi", "fuefuki", "fujikawa", "fujikawaguchiko", "fujiyoshida", "hayakawa", "hokuto", "ichikawamisato", "kai", "kofu", "koshu", "kosuge", "minami-alps", "minobu", "nakamichi", "nanbu", "narusawa", "nirasaki", "nishikatsura", "oshino", "otsuki", "showa", "tabayama", "tsuru", "uenohara", "yamanakako", "yamanashi", "city", "com", "edu", "gov", "mil", "net", "org", "biz", "com", "edu", "gov", "info", "net", "org", "ass", "asso", "com", "coop", "edu", "gouv", "gov", "medecin", "mil", "nom", "notaires", "org", "pharmaciens", "prd", "presse", "tm", "veterinaire", "edu", "gov", "net", "org", "com", "edu", "gov", "org", "rep", "tra", "ac", "blogspot", "busan", "chungbuk", "chungnam", "co", "daegu", "daejeon", "es", "gangwon", "go", "gwangju", "gyeongbuk", "gyeonggi", "gyeongnam", "hs", "incheon", "jeju", "jeonbuk", "jeonnam", "kg", "mil", "ms", "ne", "or", "pe", "re", "sc", "seoul", "ulsan", "com", "edu", "gov", "net", "org", "com", "edu", "gov", "mil", "net", "org", "c", "com", "edu", "gov", "info", "int", "net", "org", "per", "com", "edu", "gov", "net", "org", "co", "com", "edu", "gov", "net", "org", "assn", "com", "edu", "gov", "grp", "hotel", "int", "ltd", "net", "ngo", "org", "sch", "soc", "web", "com", "edu", "gov", "net", "org", "co", "org", "gov", "asn", "com", "conf", "edu", "gov", "id", "mil", "net", "org", "com", "edu", "gov", "id", "med", "net", "org", "plc", "sch", "ac", "co", "gov", "net", "org", "press", "asso", "tm", "ac", "co", "edu", "gov", "its", "net", "org", "priv", "com", "edu", "gov", "mil", "nom", "org", "prd", "tm", "com", "edu", "gov", "inf", "name", "net", "org", "com", "edu", "gouv", "gov", "net", "org", "presse", "edu", "gov", "nyc", "org", "com", "edu", "gov", "net", "org", "blogspot", "gov", "ac", "co", "com", "gov", "net", "or", "org", "academy", "agriculture", "air", "airguard", "alabama", "alaska", "amber", "ambulance", "american", "americana", "americanantiques", "americanart", "amsterdam", "and", "annefrank", "anthro", "anthropology", "antiques", "aquarium", "arboretum", "archaeological", "archaeology", "architecture", "art", "artanddesign", "artcenter", "artdeco", "arteducation", "artgallery", "arts", "artsandcrafts", "asmatart", "assassination", "assisi", "association", "astronomy", "atlanta", "austin", "australia", "automotive", "aviation", "axis", "badajoz", "baghdad", "bahn", "bale", "baltimore", "barcelona", "baseball", "basel", "baths", "bauern", "beauxarts", "beeldengeluid", "bellevue", "bergbau", "berkeley", "berlin", "bern", "bible", "bilbao", "bill", "birdart", "birthplace", "bonn", "boston", "botanical", "botanicalgarden", "botanicgarden", "botany", "brandywinevalley", "brasil", "bristol", "british", "britishcolumbia", "broadcast", "brunel", "brussel", "brussels", "bruxelles", "building", "burghof", "bus", "bushey", "cadaques", "california", "cambridge", "can", "canada", "capebreton", "carrier", "cartoonart", "casadelamoneda", "castle", "castres", "celtic", "center", "chattanooga", "cheltenham", "chesapeakebay", "chicago", "children", "childrens", "childrensgarden", "chiropractic", "chocolate", "christiansburg", "cincinnati", "cinema", "circus", "civilisation", "civilization", "civilwar", "clinton", "clock", "coal", "coastaldefence", "cody", "coldwar", "collection", "colonialwilliamsburg", "coloradoplateau", "columbia", "columbus", "communication", "communications", "community", "computer", "computerhistory", "contemporary", "contemporaryart", "convent", "copenhagen", "corporation", "corvette", "costume", "countryestate", "county", "crafts", "cranbrook", "creation", "cultural", "culturalcenter", "culture", "cyber", "cymru", "dali", "dallas", "database", "ddr", "decorativearts", "delaware", "delmenhorst", "denmark", "depot", "design", "detroit", "dinosaur", "discovery", "dolls", "donostia", "durham", "eastafrica", "eastcoast", "education", "educational", "egyptian", "eisenbahn", "elburg", "elvendrell", "embroidery", "encyclopedic", "england", "entomology", "environment", "environmentalconservation", "epilepsy", "essex", "estate", "ethnology", "exeter", "exhibition", "family", "farm", "farmequipment", "farmers", "farmstead", "field", "figueres", "filatelia", "film", "fineart", "finearts", "finland", "flanders", "florida", "force", "fortmissoula", "fortworth", "foundation", "francaise", "frankfurt", "franziskaner", "freemasonry", "freiburg", "fribourg", "frog", "fundacio", "furniture", "gallery", "garden", "gateway", "geelvinck", "gemological", "geology", "georgia", "giessen", "glas", "glass", "gorge", "grandrapids", "graz", "guernsey", "halloffame", "hamburg", "handson", "harvestcelebration", "hawaii", "health", "heimatunduhren", "hellas", "helsinki", "hembygdsforbund", "heritage", "histoire", "historical", "historicalsociety", "historichouses", "historisch", "historisches", "history", "historyofscience", "horology", "house", "humanities", "illustration", "imageandsound", "indian", "indiana", "indianapolis", "indianmarket", "intelligence", "interactive", "iraq", "iron", "isleofman", "jamison", "jefferson", "jerusalem", "jewelry", "jewish", "jewishart", "jfk", "journalism", "judaica", "judygarland", "juedisches", "juif", "karate", "karikatur", "kids", "koebenhavn", "koeln", "kunst", "kunstsammlung", "kunstunddesign", "labor", "labour", "lajolla", "lancashire", "landes", "lans", "larsson", "lewismiller", "lincoln", "linz", "living", "livinghistory", "localhistory", "london", "losangeles", "louvre", "loyalist", "lucerne", "luxembourg", "luzern", "mad", "madrid", "mallorca", "manchester", "mansion", "mansions", "manx", "marburg", "maritime", "maritimo", "maryland", "marylhurst", "media", "medical", "medizinhistorisches", "meeres", "memorial", "mesaverde", "michigan", "midatlantic", "military", "mill", "miners", "mining", "minnesota", "missile", "missoula", "modern", "moma", "money", "monmouth", "monticello", "montreal", "moscow", "motorcycle", "muenchen", "muenster", "mulhouse", "muncie", "museet", "museumcenter", "museumvereniging", "music", "national", "nationalfirearms", "nationalheritage", "nativeamerican", "naturalhistory", "naturalhistorymuseum", "naturalsciences", "nature", "naturhistorisches", "natuurwetenschappen", "naumburg", "naval", "nebraska", "neues", "newhampshire", "newjersey", "newmexico", "newport", "newspaper", "newyork", "niepce", "norfolk", "north", "nrw", "nuernberg", "nuremberg", "nyc", "nyny", "oceanographic", "oceanographique", "omaha", "online", "ontario", "openair", "oregon", "oregontrail", "otago", "oxford", "pacific", "paderborn", "palace", "paleo", "palmsprings", "panama", "paris", "pasadena", "pharmacy", "philadelphia", "philadelphiaarea", "philately", "phoenix", "photography", "pilots", "pittsburgh", "planetarium", "plantation", "plants", "plaza", "portal", "portland", "portlligat", "posts-and-telecommunications", "preservation", "presidio", "press", "project", "public", "pubol", "quebec", "railroad", "railway", "research", "resistance", "riodejaneiro", "rochester", "rockart", "roma", "russia", "saintlouis", "salem", "salvadordali", "salzburg", "sandiego", "sanfrancisco", "santabarbara", "santacruz", "santafe", "saskatchewan", "satx", "savannahga", "schlesisches", "schoenbrunn", "schokoladen", "school", "schweiz", "science", "science-fiction", "scienceandhistory", "scienceandindustry", "sciencecenter", "sciencecenters", "sciencehistory", "sciences", "sciencesnaturelles", "scotland", "seaport", "settlement", "settlers", "shell", "sherbrooke", "sibenik", "silk", "ski", "skole", "society", "sologne", "soundandvision", "southcarolina", "southwest", "space", "spy", "square", "stadt", "stalbans", "starnberg", "state", "stateofdelaware", "station", "steam", "steiermark", "stjohn", "stockholm", "stpetersburg", "stuttgart", "suisse", "surgeonshall", "surrey", "svizzera", "sweden", "sydney", "tank", "tcm", "technology", "telekommunikation", "television", "texas", "textile", "theater", "time", "timekeeping", "topology", "torino", "touch", "town", "transport", "tree", "trolley", "trust", "trustee", "uhren", "ulm", "undersea", "university", "usa", "usantiques", "usarts", "uscountryestate", "usculture", "usdecorativearts", "usgarden", "ushistory", "ushuaia", "uslivinghistory", "utah", "uvic", "valley", "vantaa", "versailles", "viking", "village", "virginia", "virtual", "virtuel", "vlaanderen", "volkenkunde", "wales", "wallonie", "war", "washingtondc", "watch-and-clock", "watchandclock", "western", "westfalen", "whaling", "wildlife", "williamsburg", "windmill", "workshop", "xn--9dbhblg6di", "xn--comunicaes-v6a2o", "xn--correios-e-telecomunicaes-ghc29a", "xn--h1aegh", "xn--lns-qla", "york", "yorkshire", "yosemite", "youth", "zoological", "zoology", "aero", "biz", "com", "coop", "edu", "gov", "info", "int", "mil", "museum", "name", "net", "org", "pro", "ac", "biz", "co", "com", "coop", "edu", "gov", "int", "museum", "net", "org", "blogspot", "com", "edu", "gob", "net", "org", "com", "edu", "gov", "mil", "name", "net", "org", "teledata", "ca", "cc", "co", "com", "dr", "in", "info", "mobi", "mx", "name", "or", "org", "pro", "school", "tv", "us", "ws", "her", "his", "forgot", "forgot", "asso", "at-band-camp", "blogdns", "broke-it", "buyshouses", "cloudfront", "dnsalias", "dnsdojo", "does-it", "dontexist", "dynalias", "dynathome", "endofinternet", "fastly", "from-az", "from-co", "from-la", "from-ny", "gb", "gets-it", "ham-radio-op", "homeftp", "homeip", "homelinux", "homeunix", "hu", "in-the-band", "is-a-chef", "is-a-geek", "isa-geek", "jp", "kicks-ass", "office-on-the", "podzone", "scrapper-site", "se", "selfip", "sells-it", "servebbs", "serveftp", "thruhere", "uk", "webhop", "za", "prod", "ssl", "a", "global", "a", "b", "global", "arts", "com", "firm", "info", "net", "other", "per", "rec", "store", "web", "com", "edu", "gov", "mil", "mobi", "name", "net", "org", "sch", "blogspot", "bv", "co", "aa", "aarborte", "aejrie", "afjord", "agdenes", "ah", "akershus", "aknoluokta", "akrehamn", "al", "alaheadju", "alesund", "algard", "alstahaug", "alta", "alvdal", "amli", "amot", "andasuolo", "andebu", "andoy", "ardal", "aremark", "arendal", "arna", "aseral", "asker", "askim", "askoy", "askvoll", "asnes", "audnedaln", "aukra", "aure", "aurland", "aurskog-holand", "austevoll", "austrheim", "averoy", "badaddja", "bahcavuotna", "bahccavuotna", "baidar", "bajddar", "balat", "balestrand", "ballangen", "balsfjord", "bamble", "bardu", "barum", "batsfjord", "bearalvahki", "beardu", "beiarn", "berg", "bergen", "berlevag", "bievat", "bindal", "birkenes", "bjarkoy", "bjerkreim", "bjugn", "blogspot", "bodo", "bokn", "bomlo", "bremanger", "bronnoy", "bronnoysund", "brumunddal", "bryne", "bu", "budejju", "buskerud", "bygland", "bykle", "cahcesuolo", "co", "davvenjarga", "davvesiida", "deatnu", "dep", "dielddanuorri", "divtasvuodna", "divttasvuotna", "donna", "dovre", "drammen", "drangedal", "drobak", "dyroy", "egersund", "eid", "eidfjord", "eidsberg", "eidskog", "eidsvoll", "eigersund", "elverum", "enebakk", "engerdal", "etne", "etnedal", "evenassi", "evenes", "evje-og-hornnes", "farsund", "fauske", "fedje", "fet", "fetsund", "fhs", "finnoy", "fitjar", "fjaler", "fjell", "fla", "flakstad", "flatanger", "flekkefjord", "flesberg", "flora", "floro", "fm", "folkebibl", "folldal", "forde", "forsand", "fosnes", "frana", "fredrikstad", "frei", "frogn", "froland", "frosta", "froya", "fuoisku", "fuossko", "fusa", "fylkesbibl", "fyresdal", "gaivuotna", "galsa", "gamvik", "gangaviika", "gaular", "gausdal", "giehtavuoatna", "gildeskal", "giske", "gjemnes", "gjerdrum", "gjerstad", "gjesdal", "gjovik", "gloppen", "gol", "gran", "grane", "granvin", "gratangen", "grimstad", "grong", "grue", "gulen", "guovdageaidnu", "ha", "habmer", "hadsel", "hagebostad", "halden", "halsa", "hamar", "hamaroy", "hammarfeasta", "hammerfest", "hapmir", "haram", "hareid", "harstad", "hasvik", "hattfjelldal", "haugesund", "hedmark", "hemne", "hemnes", "hemsedal", "herad", "hitra", "hjartdal", "hjelmeland", "hl", "hm", "hobol", "hof", "hokksund", "hol", "hole", "holmestrand", "holtalen", "honefoss", "hordaland", "hornindal", "horten", "hoyanger", "hoylandet", "hurdal", "hurum", "hvaler", "hyllestad", "ibestad", "idrett", "inderoy", "iveland", "ivgu", "jan-mayen", "jessheim", "jevnaker", "jolster", "jondal", "jorpeland", "kafjord", "karasjohka", "karasjok", "karlsoy", "karmoy", "kautokeino", "kirkenes", "klabu", "klepp", "kommune", "kongsberg", "kongsvinger", "kopervik", "kraanghke", "kragero", "kristiansand", "kristiansund", "krodsherad", "krokstadelva", "kvafjord", "kvalsund", "kvam", "kvanangen", "kvinesdal", "kvinnherad", "kviteseid", "kvitsoy", "laakesvuemie", "lahppi", "langevag", "lardal", "larvik", "lavagis", "lavangen", "leangaviika", "lebesby", "leikanger", "leirfjord", "leirvik", "leka", "leksvik", "lenvik", "lerdal", "lesja", "levanger", "lier", "lierne", "lillehammer", "lillesand", "lindas", "lindesnes", "loabat", "lodingen", "lom", "loppa", "lorenskog", "loten", "lund", "lunner", "luroy", "luster", "lyngdal", "lyngen", "malatvuopmi", "malselv", "malvik", "mandal", "marker", "marnardal", "masfjorden", "masoy", "matta-varjjat", "meland", "meldal", "melhus", "meloy", "meraker", "midsund", "midtre-gauldal", "mil", "mjondalen", "mo-i-rana", "moareke", "modalen", "modum", "molde", "more-og-romsdal", "mosjoen", "moskenes", "moss", "mosvik", "mr", "muosat", "museum", "naamesjevuemie", "namdalseid", "namsos", "namsskogan", "nannestad", "naroy", "narviika", "narvik", "naustdal", "navuotna", "nedre-eiker", "nesna", "nesodden", "nesoddtangen", "nesseby", "nesset", "nissedal", "nittedal", "nl", "nord-aurdal", "nord-fron", "nord-odal", "norddal", "nordkapp", "nordland", "nordre-land", "nordreisa", "nore-og-uvdal", "notodden", "notteroy", "nt", "odda", "of", "oksnes", "ol", "omasvuotna", "oppdal", "oppegard", "orkanger", "orkdal", "orland", "orskog", "orsta", "osen", "oslo", "osoyro", "osteroy", "ostfold", "ostre-toten", "overhalla", "ovre-eiker", "oyer", "oygarden", "oystre-slidre", "porsanger", "porsangu", "porsgrunn", "priv", "rade", "radoy", "rahkkeravju", "raholt", "raisa", "rakkestad", "ralingen", "rana", "randaberg", "rauma", "rendalen", "rennebu", "rennesoy", "rindal", "ringebu", "ringerike", "ringsaker", "risor", "rissa", "rl", "roan", "rodoy", "rollag", "romsa", "romskog", "roros", "rost", "royken", "royrvik", "ruovat", "rygge", "salangen", "salat", "saltdal", "samnanger", "sandefjord", "sandnes", "sandnessjoen", "sandoy", "sarpsborg", "sauda", "sauherad", "sel", "selbu", "selje", "seljord", "sf", "siellak", "sigdal", "siljan", "sirdal", "skanit", "skanland", "skaun", "skedsmo", "skedsmokorset", "ski", "skien", "skierva", "skiptvet", "skjak", "skjervoy", "skodje", "slattum", "smola", "snaase", "snasa", "snillfjord", "snoasa", "sogndal", "sogne", "sokndal", "sola", "solund", "somna", "sondre-land", "songdalen", "sor-aurdal", "sor-fron", "sor-odal", "sor-varanger", "sorfold", "sorreisa", "sortland", "sorum", "spjelkavik", "spydeberg", "st", "stange", "stat", "stathelle", "stavanger", "stavern", "steigen", "steinkjer", "stjordal", "stjordalshalsen", "stokke", "stor-elvdal", "stord", "stordal", "storfjord", "strand", "stranda", "stryn", "sula", "suldal", "sund", "sunndal", "surnadal", "svalbard", "sveio", "svelvik", "sykkylven", "tana", "tananger", "telemark", "time", "tingvoll", "tinn", "tjeldsund", "tjome", "tm", "tokke", "tolga", "tonsberg", "torsken", "tr", "trana", "tranby", "tranoy", "troandin", "trogstad", "tromsa", "tromso", "trondheim", "trysil", "tvedestrand", "tydal", "tynset", "tysfjord", "tysnes", "tysvar", "ullensaker", "ullensvang", "ulvik", "unjarga", "utsira", "va", "vaapste", "vadso", "vaga", "vagan", "vagsoy", "vaksdal", "valle", "vang", "vanylven", "vardo", "varggat", "varoy", "vefsn", "vega", "vegarshei", "vennesla", "verdal", "verran", "vestby", "vestfold", "vestnes", "vestre-slidre", "vestre-toten", "vestvagoy", "vevelstad", "vf", "vgs", "vik", "vikna", "vindafjord", "voagat", "volda", "voss", "vossevangen", "xn--andy-ira", "xn--asky-ira", "xn--aurskog-hland-jnb", "xn--avery-yua", "xn--bdddj-mrabd", "xn--bearalvhki-y4a", "xn--berlevg-jxa", "xn--bhcavuotna-s4a", "xn--bhccavuotna-k7a", "xn--bidr-5nac", "xn--bievt-0qa", "xn--bjarky-fya", "xn--bjddar-pta", "xn--blt-elab", "xn--bmlo-gra", "xn--bod-2na", "xn--brnny-wuac", "xn--brnnysund-m8ac", "xn--brum-voa", "xn--btsfjord-9za", "xn--davvenjrga-y4a", "xn--dnna-gra", "xn--drbak-wua", "xn--dyry-ira", "xn--eveni-0qa01ga", "xn--finny-yua", "xn--fjord-lra", "xn--fl-zia", "xn--flor-jra", "xn--frde-gra", "xn--frna-woa", "xn--frya-hra", "xn--ggaviika-8ya47h", "xn--gildeskl-g0a", "xn--givuotna-8ya", "xn--gjvik-wua", "xn--gls-elac", "xn--h-2fa", "xn--hbmer-xqa", "xn--hcesuolo-7ya35b", "xn--hgebostad-g3a", "xn--hmmrfeasta-s4ac", "xn--hnefoss-q1a", "xn--hobl-ira", "xn--holtlen-hxa", "xn--hpmir-xqa", "xn--hyanger-q1a", "xn--hylandet-54a", "xn--indery-fya", "xn--jlster-bya", "xn--jrpeland-54a", "xn--karmy-yua", "xn--kfjord-iua", "xn--klbu-woa", "xn--koluokta-7ya57h", "xn--krager-gya", "xn--kranghke-b0a", "xn--krdsherad-m8a", "xn--krehamn-dxa", "xn--krjohka-hwab49j", "xn--ksnes-uua", "xn--kvfjord-nxa", "xn--kvitsy-fya", "xn--kvnangen-k0a", "xn--l-1fa", "xn--laheadju-7ya", "xn--langevg-jxa", "xn--ldingen-q1a", "xn--leagaviika-52b", "xn--lesund-hua", "xn--lgrd-poac", "xn--lhppi-xqa", "xn--linds-pra", "xn--loabt-0qa", "xn--lrdal-sra", "xn--lrenskog-54a", "xn--lt-liac", "xn--lten-gra", "xn--lury-ira", "xn--mely-ira", "xn--merker-kua", "xn--mjndalen-64a", "xn--mlatvuopmi-s4a", "xn--mli-tla", "xn--mlselv-iua", "xn--moreke-jua", "xn--mosjen-eya", "xn--mot-tla", "xn--mre-og-romsdal-qqb", "xn--msy-ula0h", "xn--mtta-vrjjat-k7af", "xn--muost-0qa", "xn--nmesjevuemie-tcba", "xn--nry-yla5g", "xn--nttery-byae", "xn--nvuotna-hwa", "xn--oppegrd-ixa", "xn--ostery-fya", "xn--osyro-wua", "xn--porsgu-sta26f", "xn--rady-ira", "xn--rdal-poa", "xn--rde-ula", "xn--rdy-0nab", "xn--rennesy-v1a", "xn--rhkkervju-01af", "xn--rholt-mra", "xn--risa-5na", "xn--risr-ira", "xn--rland-uua", "xn--rlingen-mxa", "xn--rmskog-bya", "xn--rros-gra", "xn--rskog-uua", "xn--rst-0na", "xn--rsta-fra", "xn--ryken-vua", "xn--ryrvik-bya", "xn--s-1fa", "xn--sandnessjen-ogb", "xn--sandy-yua", "xn--seral-lra", "xn--sgne-gra", "xn--skierv-uta", "xn--skjervy-v1a", "xn--skjk-soa", "xn--sknit-yqa", "xn--sknland-fxa", "xn--slat-5na", "xn--slt-elab", "xn--smla-hra", "xn--smna-gra", "xn--snase-nra", "xn--sndre-land-0cb", "xn--snes-poa", "xn--snsa-roa", "xn--sr-aurdal-l8a", "xn--sr-fron-q1a", "xn--sr-odal-q1a", "xn--sr-varanger-ggb", "xn--srfold-bya", "xn--srreisa-q1a", "xn--srum-gra", "xn--stfold-9xa", "xn--stjrdal-s1a", "xn--stjrdalshalsen-sqb", "xn--stre-toten-zcb", "xn--tjme-hra", "xn--tnsberg-q1a", "xn--trany-yua", "xn--trgstad-r1a", "xn--trna-woa", "xn--troms-zua", "xn--tysvr-vra", "xn--unjrga-rta", "xn--vads-jra", "xn--vard-jra", "xn--vegrshei-c0a", "xn--vestvgy-ixa6o", "xn--vg-yiab", "xn--vgan-qoa", "xn--vgsy-qoa0j", "xn--vre-eiker-k8a", "xn--vrggt-xqad", "xn--vry-yla5g", "xn--yer-zna", "xn--ygarden-p1a", "xn--ystre-slidre-ujb", "gs", "gs", "nes", "gs", "nes", "gs", "os", "valer", "xn--vler-qoa", "gs", "gs", "os", "gs", "heroy", "sande", "gs", "gs", "bo", "heroy", "xn--b-5ga", "xn--hery-ira", "gs", "gs", "gs", "gs", "valer", "gs", "gs", "gs", "gs", "bo", "xn--b-5ga", "gs", "gs", "gs", "sande", "gs", "sande", "xn--hery-ira", "xn--vler-qoa", "biz", "com", "edu", "gov", "info", "net", "org", "merseine", "mine", "shacknet", "co", "blogspot", "co", "com", "edu", "gov", "med", "mediaphone", "museum", "nawras", "nawrastelecom", "net", "omanmobile", "omanpost", "omantel", "org", "pro", "rakpetroleum", "siemens", "songfest", "statecouncil", "ae", "blogdns", "blogsite", "boldlygoingnowhere", "dnsalias", "dnsdojo", "doesntexist", "dontexist", "doomdns", "dvrdns", "dynalias", "dyndns", "endofinternet", "endoftheinternet", "from-me", "game-host", "gotdns", "hobby-site", "homedns", "homeftp", "homelinux", "homeunix", "is-a-bruinsfan", "is-a-candidate", "is-a-celticsfan", "is-a-chef", "is-a-geek", "is-a-knight", "is-a-linux-user", "is-a-patsfan", "is-a-soxfan", "is-found", "is-lost", "is-saved", "is-very-bad", "is-very-evil", "is-very-good", "is-very-nice", "is-very-sweet", "isa-geek", "kicks-ass", "misconfused", "podzone", "readmyblog", "selfip", "sellsyourhome", "servebbs", "serveftp", "servegame", "stuff-4-sale", "us", "webhop", "za", "go", "home", "abo", "ac", "com", "edu", "gob", "ing", "med", "net", "nom", "org", "sld", "com", "edu", "gob", "mil", "net", "nom", "org", "com", "edu", "org", "com", "edu", "gov", "i", "mil", "net", "ngo", "org", "biz", "com", "edu", "fam", "gob", "gok", "gon", "gop", "gos", "gov", "info", "net", "org", "web", "6bone", "agro", "aid", "art", "atm", "augustow", "auto", "babia-gora", "bedzin", "beskidy", "bialowieza", "bialystok", "bielawa", "bieszczady", "biz", "boleslawiec", "bydgoszcz", "bytom", "cieszyn", "co", "com", "czeladz", "czest", "dlugoleka", "edu", "elblag", "elk", "gda", "gdansk", "gdynia", "gliwice", "glogow", "gmina", "gniezno", "gorlice", "gov", "grajewo", "gsm", "ilawa", "info", "irc", "jaworzno", "jelenia-gora", "jgora", "kalisz", "karpacz", "kartuzy", "kaszuby", "katowice", "kazimierz-dolny", "kepno", "ketrzyn", "klodzko", "kobierzyce", "kolobrzeg", "konin", "konskowola", "krakow", "kutno", "lapy", "lebork", "legnica", "lezajsk", "limanowa", "lomza", "lowicz", "lubin", "lukow", "mail", "malbork", "malopolska", "mazowsze", "mazury", "mbone", "med", "media", "miasta", "mielec", "mielno", "mil", "mragowo", "naklo", "net", "ngo", "nieruchomosci", "nom", "nowaruda", "nysa", "olawa", "olecko", "olkusz", "olsztyn", "opoczno", "opole", "org", "ostroda", "ostroleka", "ostrowiec", "ostrowwlkp", "pc", "pila", "pisz", "podhale", "podlasie", "polkowice", "pomorskie", "pomorze", "powiat", "poznan", "priv", "prochowice", "pruszkow", "przeworsk", "pulawy", "radom", "rawa-maz", "realestate", "rel", "rybnik", "rzeszow", "sanok", "sejny", "sex", "shop", "siedlce", "sklep", "skoczow", "slask", "slupsk", "sopot", "sos", "sosnowiec", "stalowa-wola", "starachowice", "stargard", "suwalki", "swidnica", "swiebodzin", "swinoujscie", "szczecin", "szczytno", "szkola", "targi", "tarnobrzeg", "tgory", "tm", "tourism", "travel", "turek", "turystyka", "tychy", "usenet", "ustka", "walbrzych", "warmia", "warszawa", "waw", "wegrow", "wielun", "wlocl", "wloclawek", "wodzislaw", "wolomin", "wroc", "wroclaw", "zachpomor", "zagan", "zakopane", "zarow", "zgora", "zgorzelec", "pa", "po", "so", "sr", "starostwo", "ug", "um", "upow", "uw", "co", "edu", "gov", "net", "org", "ac", "biz", "com", "edu", "est", "gov", "info", "isla", "name", "net", "org", "pro", "prof", "aca", "bar", "cpa", "eng", "jur", "law", "med", "com", "edu", "gov", "net", "org", "plo", "sec", "blogspot", "com", "edu", "gov", "int", "net", "nome", "org", "publ", "belau", "co", "ed", "go", "ne", "or", "com", "coop", "edu", "gov", "mil", "net", "org", "com", "edu", "gov", "mil", "name", "net", "org", "sch", "asso", "blogspot", "com", "nom", "arts", "blogspot", "com", "firm", "info", "nom", "nt", "org", "rec", "store", "tm", "www", "ac", "co", "edu", "gov", "in", "org", "ac", "adygeya", "altai", "amur", "amursk", "arkhangelsk", "astrakhan", "baikal", "bashkiria", "belgorod", "bir", "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", "magnitka", "mari", "mari-el", "marine", "mil", "mordovia", "mosreg", "msk", "murmansk", "mytis", "nakhodka", "nalchik", "net", "nkz", "nnov", "norilsk", "nov", "novosibirsk", "nsk", "omsk", "orenburg", "org", "oryol", "oskol", "palana", "penza", "perm", "pp", "pskov", "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", "edu", "gouv", "gov", "int", "mil", "net", "com", "edu", "gov", "med", "net", "org", "pub", "sch", "com", "edu", "gov", "net", "org", "com", "edu", "gov", "net", "org", "com", "edu", "gov", "info", "med", "net", "org", "tv", "a", "ac", "b", "bd", "blogspot", "brand", "c", "d", "e", "f", "fh", "fhsk", "fhv", "g", "h", "i", "k", "komforb", "kommunalforbund", "komvux", "l", "lanbib", "m", "n", "naturbruksgymn", "o", "org", "p", "parti", "pp", "press", "r", "s", "sshn", "t", "tm", "u", "w", "x", "y", "z", "blogspot", "com", "edu", "gov", "net", "org", "per", "com", "gov", "mil", "net", "org", "blogspot", "com", "edu", "gov", "net", "org", "art", "com", "edu", "gouv", "org", "perso", "univ", "com", "net", "org", "co", "com", "consulado", "edu", "embaixada", "gov", "mil", "net", "org", "principe", "saotome", "store", "com", "edu", "gob", "org", "red", "gov", "com", "edu", "gov", "mil", "net", "org", "ac", "co", "org", "blogspot", "ac", "co", "go", "in", "mi", "net", "or", "ac", "biz", "co", "com", "edu", "go", "gov", "int", "mil", "name", "net", "nic", "org", "test", "web", "gov", "co", "com", "edu", "gov", "mil", "net", "nom", "org", "agrinet", "com", "defense", "edunet", "ens", "fin", "gov", "ind", "info", "intl", "mincom", "nat", "net", "org", "perso", "rnrt", "rns", "rnu", "tourism", "turen", "com", "edu", "gov", "mil", "net", "org", "nc", "nic", "gov", "aero", "biz", "co", "com", "coop", "edu", "gov", "info", "int", "jobs", "mobi", "museum", "name", "net", "org", "pro", "travel", "better-than", "dyndns", "on-the-web", "worse-than", "blogspot", "club", "com", "ebiz", "edu", "game", "gov", "idv", "mil", "net", "org", "xn--czrw28b", "xn--uc0atv", "xn--zf0ao64a", "ac", "co", "go", "hotel", "info", "me", "mil", "mobi", "ne", "or", "sc", "tv", "cherkassy", "cherkasy", "chernigov", "chernihiv", "chernivtsi", "chernovtsy", "ck", "cn", "co", "com", "cr", "crimea", "cv", "dn", "dnepropetrovsk", "dnipropetrovsk", "dominic", "donetsk", "dp", "edu", "gov", "if", "in", "ivano-frankivsk", "kh", "kharkiv", "kharkov", "kherson", "khmelnitskiy", "khmelnytskyi", "kiev", "kirovograd", "km", "kr", "krym", "ks", "kv", "kyiv", "lg", "lt", "lugansk", "lutsk", "lv", "lviv", "mk", "mykolaiv", "net", "nikolaev", "od", "odesa", "odessa", "org", "pl", "poltava", "pp", "rivne", "rovno", "rv", "sb", "sebastopol", "sevastopol", "sm", "sumy", "te", "ternopil", "uz", "uzhgorod", "vinnica", "vinnytsia", "vn", "volyn", "yalta", "zaporizhzhe", "zaporizhzhia", "zhitomir", "zhytomyr", "zp", "zt", "ac", "co", "com", "go", "ne", "or", "org", "sc", "bl", "british-library", "co", "jet", "mod", "national-library-scotland", "nel", "nic", "nls", "parliament", "sch", "blogspot", "ak", "al", "ar", "as", "az", "ca", "co", "ct", "dc", "de", "dni", "fed", "fl", "ga", "gu", "hi", "ia", "id", "il", "in", "is-by", "isa", "kids", "ks", "ky", "la", "land-4-sale", "ma", "md", "me", "mi", "mn", "mo", "ms", "mt", "nc", "nd", "ne", "nh", "nj", "nm", "nsn", "nv", "ny", "oh", "ok", "or", "pa", "pr", "ri", "sc", "sd", "stuff-4-sale", "tn", "tx", "ut", "va", "vi", "vt", "wa", "wi", "wv", "wy", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "chtr", "paroch", "pvt", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "cc", "k12", "lib", "com", "edu", "gub", "mil", "net", "org", "co", "com", "net", "org", "com", "edu", "gov", "mil", "net", "org", "co", "com", "e12", "edu", "gov", "info", "mil", "net", "org", "web", "co", "com", "k12", "net", "org", "ac", "biz", "com", "edu", "gov", "health", "info", "int", "name", "net", "org", "pro", "com", "dyndns", "edu", "gov", "mypets", "net", "org", } ������������������������������������������������go.net/LICENSE��������������������������������������������������������������������������������������0000644�0001751�0001751�00000002707�12235217213�012335� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Copyright (c) 2009 The Go Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ���������������������������������������������������������go.net/websocket/�����������������������������������������������������������������������������������0000755�0001751�0001751�00000000000�12235217213�013310� 5����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/websocket/examplehandler_test.go�������������������������������������������������������������0000644�0001751�0001751�00000001117�12235217213�017667� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// 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. package websocket_test import ( "io" "net/http" "code.google.com/p/go.net/websocket" ) // Echo the data received on the WebSocket. func EchoServer(ws *websocket.Conn) { io.Copy(ws, ws) } // This example demonstrates a trivial echo server. func ExampleHandler() { http.Handle("/echo", websocket.Handler(EchoServer)) err := http.ListenAndServe(":12345", nil) if err != nil { panic("ListenAndServe: " + err.Error()) } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/websocket/websocket_test.go������������������������������������������������������������������0000644�0001751�0001751�00000017152�12235217213�016672� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// 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 websocket import ( "bytes" "fmt" "io" "log" "net" "net/http" "net/http/httptest" "net/url" "strings" "sync" "testing" ) var serverAddr string var once sync.Once func echoServer(ws *Conn) { io.Copy(ws, ws) } type Count struct { S string N int } func countServer(ws *Conn) { for { var count Count err := JSON.Receive(ws, &count) if err != nil { return } count.N++ count.S = strings.Repeat(count.S, count.N) err = JSON.Send(ws, count) if err != nil { return } } } func subProtocolHandshake(config *Config, req *http.Request) error { for _, proto := range config.Protocol { if proto == "chat" { config.Protocol = []string{proto} return nil } } return ErrBadWebSocketProtocol } func subProtoServer(ws *Conn) { for _, proto := range ws.Config().Protocol { io.WriteString(ws, proto) } } func startServer() { http.Handle("/echo", Handler(echoServer)) http.Handle("/count", Handler(countServer)) subproto := Server{ Handshake: subProtocolHandshake, Handler: Handler(subProtoServer), } http.Handle("/subproto", subproto) server := httptest.NewServer(nil) serverAddr = server.Listener.Addr().String() log.Print("Test WebSocket server listening on ", serverAddr) } func newConfig(t *testing.T, path string) *Config { config, _ := NewConfig(fmt.Sprintf("ws://%s%s", serverAddr, path), "http://localhost") return config } func TestEcho(t *testing.T) { once.Do(startServer) // websocket.Dial() client, err := net.Dial("tcp", serverAddr) if err != nil { t.Fatal("dialing", err) } conn, err := NewClient(newConfig(t, "/echo"), client) if err != nil { t.Errorf("WebSocket handshake error: %v", err) return } msg := []byte("hello, world\n") if _, err := conn.Write(msg); err != nil { t.Errorf("Write: %v", err) } var actual_msg = make([]byte, 512) n, err := conn.Read(actual_msg) if err != nil { t.Errorf("Read: %v", err) } actual_msg = actual_msg[0:n] if !bytes.Equal(msg, actual_msg) { t.Errorf("Echo: expected %q got %q", msg, actual_msg) } conn.Close() } func TestAddr(t *testing.T) { once.Do(startServer) // websocket.Dial() client, err := net.Dial("tcp", serverAddr) if err != nil { t.Fatal("dialing", err) } conn, err := NewClient(newConfig(t, "/echo"), client) if err != nil { t.Errorf("WebSocket handshake error: %v", err) return } ra := conn.RemoteAddr().String() if !strings.HasPrefix(ra, "ws://") || !strings.HasSuffix(ra, "/echo") { t.Errorf("Bad remote addr: %v", ra) } la := conn.LocalAddr().String() if !strings.HasPrefix(la, "http://") { t.Errorf("Bad local addr: %v", la) } conn.Close() } func TestCount(t *testing.T) { once.Do(startServer) // websocket.Dial() client, err := net.Dial("tcp", serverAddr) if err != nil { t.Fatal("dialing", err) } conn, err := NewClient(newConfig(t, "/count"), client) if err != nil { t.Errorf("WebSocket handshake error: %v", err) return } var count Count count.S = "hello" if err := JSON.Send(conn, count); err != nil { t.Errorf("Write: %v", err) } if err := JSON.Receive(conn, &count); err != nil { t.Errorf("Read: %v", err) } if count.N != 1 { t.Errorf("count: expected %d got %d", 1, count.N) } if count.S != "hello" { t.Errorf("count: expected %q got %q", "hello", count.S) } if err := JSON.Send(conn, count); err != nil { t.Errorf("Write: %v", err) } if err := JSON.Receive(conn, &count); err != nil { t.Errorf("Read: %v", err) } if count.N != 2 { t.Errorf("count: expected %d got %d", 2, count.N) } if count.S != "hellohello" { t.Errorf("count: expected %q got %q", "hellohello", count.S) } conn.Close() } func TestWithQuery(t *testing.T) { once.Do(startServer) client, err := net.Dial("tcp", serverAddr) if err != nil { t.Fatal("dialing", err) } config := newConfig(t, "/echo") config.Location, err = url.ParseRequestURI(fmt.Sprintf("ws://%s/echo?q=v", serverAddr)) if err != nil { t.Fatal("location url", err) } ws, err := NewClient(config, client) if err != nil { t.Errorf("WebSocket handshake: %v", err) return } ws.Close() } func testWithProtocol(t *testing.T, subproto []string) (string, error) { once.Do(startServer) client, err := net.Dial("tcp", serverAddr) if err != nil { t.Fatal("dialing", err) } config := newConfig(t, "/subproto") config.Protocol = subproto ws, err := NewClient(config, client) if err != nil { return "", err } msg := make([]byte, 16) n, err := ws.Read(msg) if err != nil { return "", err } ws.Close() return string(msg[:n]), nil } func TestWithProtocol(t *testing.T) { proto, err := testWithProtocol(t, []string{"chat"}) if err != nil { t.Errorf("SubProto: unexpected error: %v", err) } if proto != "chat" { t.Errorf("SubProto: expected %q, got %q", "chat", proto) } } func TestWithTwoProtocol(t *testing.T) { proto, err := testWithProtocol(t, []string{"test", "chat"}) if err != nil { t.Errorf("SubProto: unexpected error: %v", err) } if proto != "chat" { t.Errorf("SubProto: expected %q, got %q", "chat", proto) } } func TestWithBadProtocol(t *testing.T) { _, err := testWithProtocol(t, []string{"test"}) if err != ErrBadStatus { t.Errorf("SubProto: expected %q, got %q", ErrBadStatus) } } func TestHTTP(t *testing.T) { once.Do(startServer) // If the client did not send a handshake that matches the protocol // specification, the server MUST return an HTTP response with an // appropriate error code (such as 400 Bad Request) resp, err := http.Get(fmt.Sprintf("http://%s/echo", serverAddr)) if err != nil { t.Errorf("Get: error %#v", err) return } if resp == nil { t.Error("Get: resp is null") return } if resp.StatusCode != http.StatusBadRequest { t.Errorf("Get: expected %q got %q", http.StatusBadRequest, resp.StatusCode) } } func TestTrailingSpaces(t *testing.T) { // http://code.google.com/p/go/issues/detail?id=955 // The last runs of this create keys with trailing spaces that should not be // generated by the client. once.Do(startServer) config := newConfig(t, "/echo") for i := 0; i < 30; i++ { // body ws, err := DialConfig(config) if err != nil { t.Errorf("Dial #%d failed: %v", i, err) break } ws.Close() } } func TestDialConfigBadVersion(t *testing.T) { once.Do(startServer) config := newConfig(t, "/echo") config.Version = 1234 _, err := DialConfig(config) if dialerr, ok := err.(*DialError); ok { if dialerr.Err != ErrBadProtocolVersion { t.Errorf("dial expected err %q but got %q", ErrBadProtocolVersion, dialerr.Err) } } } func TestSmallBuffer(t *testing.T) { // http://code.google.com/p/go/issues/detail?id=1145 // Read should be able to handle reading a fragment of a frame. once.Do(startServer) // websocket.Dial() client, err := net.Dial("tcp", serverAddr) if err != nil { t.Fatal("dialing", err) } conn, err := NewClient(newConfig(t, "/echo"), client) if err != nil { t.Errorf("WebSocket handshake error: %v", err) return } msg := []byte("hello, world\n") if _, err := conn.Write(msg); err != nil { t.Errorf("Write: %v", err) } var small_msg = make([]byte, 8) n, err := conn.Read(small_msg) if err != nil { t.Errorf("Read: %v", err) } if !bytes.Equal(msg[:len(small_msg)], small_msg) { t.Errorf("Echo: expected %q got %q", msg[:len(small_msg)], small_msg) } var second_msg = make([]byte, len(msg)) n, err = conn.Read(second_msg) if err != nil { t.Errorf("Read: %v", err) } second_msg = second_msg[0:n] if !bytes.Equal(msg[len(small_msg):], second_msg) { t.Errorf("Echo: expected %q got %q", msg[len(small_msg):], second_msg) } conn.Close() } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/websocket/server.go��������������������������������������������������������������������������0000644�0001751�0001751�00000006623�12235217213�015154� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// 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 websocket import ( "bufio" "fmt" "io" "net/http" ) func newServerConn(rwc io.ReadWriteCloser, buf *bufio.ReadWriter, req *http.Request, config *Config, handshake func(*Config, *http.Request) error) (conn *Conn, err error) { var hs serverHandshaker = &hybiServerHandshaker{Config: config} code, err := hs.ReadHandshake(buf.Reader, req) if err == ErrBadWebSocketVersion { fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) fmt.Fprintf(buf, "Sec-WebSocket-Version: %s\r\n", SupportedProtocolVersion) buf.WriteString("\r\n") buf.WriteString(err.Error()) buf.Flush() return } if err != nil { fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) buf.WriteString("\r\n") buf.WriteString(err.Error()) buf.Flush() return } if handshake != nil { err = handshake(config, req) if err != nil { code = http.StatusForbidden fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) buf.WriteString("\r\n") buf.Flush() return } } err = hs.AcceptHandshake(buf.Writer) if err != nil { code = http.StatusBadRequest fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) buf.WriteString("\r\n") buf.Flush() return } conn = hs.NewServerConn(buf, rwc, req) return } // Server represents a server of a WebSocket. type Server struct { // Config is a WebSocket configuration for new WebSocket connection. Config // Handshake is an optional function in WebSocket handshake. // For example, you can check, or don't check Origin header. // Another example, you can select config.Protocol. Handshake func(*Config, *http.Request) error // Handler handles a WebSocket connection. Handler } // ServeHTTP implements the http.Handler interface for a WebSocket func (s Server) ServeHTTP(w http.ResponseWriter, req *http.Request) { s.serveWebSocket(w, req) } func (s Server) serveWebSocket(w http.ResponseWriter, req *http.Request) { rwc, buf, err := w.(http.Hijacker).Hijack() if err != nil { panic("Hijack failed: " + err.Error()) return } // The server should abort the WebSocket connection if it finds // the client did not send a handshake that matches with protocol // specification. defer rwc.Close() conn, err := newServerConn(rwc, buf, req, &s.Config, s.Handshake) if err != nil { return } if conn == nil { panic("unexpected nil conn") } s.Handler(conn) } // Handler is a simple interface to a WebSocket browser client. // It checks if Origin header is valid URL by default. // You might want to verify websocket.Conn.Config().Origin in the func. // If you use Server instead of Handler, you could call websocket.Origin and // check the origin in your Handshake func. So, if you want to accept // non-browser client, which doesn't send Origin header, you could use Server //. that doesn't check origin in its Handshake. type Handler func(*Conn) func checkOrigin(config *Config, req *http.Request) (err error) { config.Origin, err = Origin(config, req) if err == nil && config.Origin == nil { return fmt.Errorf("null origin") } return err } // ServeHTTP implements the http.Handler interface for a WebSocket func (h Handler) ServeHTTP(w http.ResponseWriter, req *http.Request) { s := Server{Handler: h, Handshake: checkOrigin} s.serveWebSocket(w, req) } �������������������������������������������������������������������������������������������������������������go.net/websocket/hybi.go����������������������������������������������������������������������������0000644�0001751�0001751�00000036032�12235217213�014576� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package websocket // This file implements a protocol of hybi draft. // http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17 import ( "bufio" "bytes" "crypto/rand" "crypto/sha1" "encoding/base64" "encoding/binary" "fmt" "io" "io/ioutil" "net/http" "net/url" "strings" ) const ( websocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" closeStatusNormal = 1000 closeStatusGoingAway = 1001 closeStatusProtocolError = 1002 closeStatusUnsupportedData = 1003 closeStatusFrameTooLarge = 1004 closeStatusNoStatusRcvd = 1005 closeStatusAbnormalClosure = 1006 closeStatusBadMessageData = 1007 closeStatusPolicyViolation = 1008 closeStatusTooBigData = 1009 closeStatusExtensionMismatch = 1010 maxControlFramePayloadLength = 125 ) var ( ErrBadMaskingKey = &ProtocolError{"bad masking key"} ErrBadPongMessage = &ProtocolError{"bad pong message"} ErrBadClosingStatus = &ProtocolError{"bad closing status"} ErrUnsupportedExtensions = &ProtocolError{"unsupported extensions"} ErrNotImplemented = &ProtocolError{"not implemented"} handshakeHeader = map[string]bool{ "Host": true, "Upgrade": true, "Connection": true, "Sec-Websocket-Key": true, "Sec-Websocket-Origin": true, "Sec-Websocket-Version": true, "Sec-Websocket-Protocol": true, "Sec-Websocket-Accept": true, } ) // A hybiFrameHeader is a frame header as defined in hybi draft. type hybiFrameHeader struct { Fin bool Rsv [3]bool OpCode byte Length int64 MaskingKey []byte data *bytes.Buffer } // A hybiFrameReader is a reader for hybi frame. type hybiFrameReader struct { reader io.Reader header hybiFrameHeader pos int64 length int } func (frame *hybiFrameReader) Read(msg []byte) (n int, err error) { n, err = frame.reader.Read(msg) if err != nil { return 0, err } if frame.header.MaskingKey != nil { for i := 0; i < n; i++ { msg[i] = msg[i] ^ frame.header.MaskingKey[frame.pos%4] frame.pos++ } } return n, err } func (frame *hybiFrameReader) PayloadType() byte { return frame.header.OpCode } func (frame *hybiFrameReader) HeaderReader() io.Reader { if frame.header.data == nil { return nil } if frame.header.data.Len() == 0 { return nil } return frame.header.data } func (frame *hybiFrameReader) TrailerReader() io.Reader { return nil } func (frame *hybiFrameReader) Len() (n int) { return frame.length } // A hybiFrameReaderFactory creates new frame reader based on its frame type. type hybiFrameReaderFactory struct { *bufio.Reader } // NewFrameReader reads a frame header from the connection, and creates new reader for the frame. // See Section 5.2 Base Framing protocol for detail. // http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#section-5.2 func (buf hybiFrameReaderFactory) NewFrameReader() (frame frameReader, err error) { hybiFrame := new(hybiFrameReader) frame = hybiFrame var header []byte var b byte // First byte. FIN/RSV1/RSV2/RSV3/OpCode(4bits) b, err = buf.ReadByte() if err != nil { return } header = append(header, b) hybiFrame.header.Fin = ((header[0] >> 7) & 1) != 0 for i := 0; i < 3; i++ { j := uint(6 - i) hybiFrame.header.Rsv[i] = ((header[0] >> j) & 1) != 0 } hybiFrame.header.OpCode = header[0] & 0x0f // Second byte. Mask/Payload len(7bits) b, err = buf.ReadByte() if err != nil { return } header = append(header, b) mask := (b & 0x80) != 0 b &= 0x7f lengthFields := 0 switch { case b <= 125: // Payload length 7bits. hybiFrame.header.Length = int64(b) case b == 126: // Payload length 7+16bits lengthFields = 2 case b == 127: // Payload length 7+64bits lengthFields = 8 } for i := 0; i < lengthFields; i++ { b, err = buf.ReadByte() if err != nil { return } header = append(header, b) hybiFrame.header.Length = hybiFrame.header.Length*256 + int64(b) } if mask { // Masking key. 4 bytes. for i := 0; i < 4; i++ { b, err = buf.ReadByte() if err != nil { return } header = append(header, b) hybiFrame.header.MaskingKey = append(hybiFrame.header.MaskingKey, b) } } hybiFrame.reader = io.LimitReader(buf.Reader, hybiFrame.header.Length) hybiFrame.header.data = bytes.NewBuffer(header) hybiFrame.length = len(header) + int(hybiFrame.header.Length) return } // A HybiFrameWriter is a writer for hybi frame. type hybiFrameWriter struct { writer *bufio.Writer header *hybiFrameHeader } func (frame *hybiFrameWriter) Write(msg []byte) (n int, err error) { var header []byte var b byte if frame.header.Fin { b |= 0x80 } for i := 0; i < 3; i++ { if frame.header.Rsv[i] { j := uint(6 - i) b |= 1 << j } } b |= frame.header.OpCode header = append(header, b) if frame.header.MaskingKey != nil { b = 0x80 } else { b = 0 } lengthFields := 0 length := len(msg) switch { case length <= 125: b |= byte(length) case length < 65536: b |= 126 lengthFields = 2 default: b |= 127 lengthFields = 8 } header = append(header, b) for i := 0; i < lengthFields; i++ { j := uint((lengthFields - i - 1) * 8) b = byte((length >> j) & 0xff) header = append(header, b) } if frame.header.MaskingKey != nil { if len(frame.header.MaskingKey) != 4 { return 0, ErrBadMaskingKey } header = append(header, frame.header.MaskingKey...) frame.writer.Write(header) data := make([]byte, length) for i := range data { data[i] = msg[i] ^ frame.header.MaskingKey[i%4] } frame.writer.Write(data) err = frame.writer.Flush() return length, err } frame.writer.Write(header) frame.writer.Write(msg) err = frame.writer.Flush() return length, err } func (frame *hybiFrameWriter) Close() error { return nil } type hybiFrameWriterFactory struct { *bufio.Writer needMaskingKey bool } func (buf hybiFrameWriterFactory) NewFrameWriter(payloadType byte) (frame frameWriter, err error) { frameHeader := &hybiFrameHeader{Fin: true, OpCode: payloadType} if buf.needMaskingKey { frameHeader.MaskingKey, err = generateMaskingKey() if err != nil { return nil, err } } return &hybiFrameWriter{writer: buf.Writer, header: frameHeader}, nil } type hybiFrameHandler struct { conn *Conn payloadType byte } func (handler *hybiFrameHandler) HandleFrame(frame frameReader) (r frameReader, err error) { if handler.conn.IsServerConn() { // The client MUST mask all frames sent to the server. if frame.(*hybiFrameReader).header.MaskingKey == nil { handler.WriteClose(closeStatusProtocolError) return nil, io.EOF } } else { // The server MUST NOT mask all frames. if frame.(*hybiFrameReader).header.MaskingKey != nil { handler.WriteClose(closeStatusProtocolError) return nil, io.EOF } } if header := frame.HeaderReader(); header != nil { io.Copy(ioutil.Discard, header) } switch frame.PayloadType() { case ContinuationFrame: frame.(*hybiFrameReader).header.OpCode = handler.payloadType case TextFrame, BinaryFrame: handler.payloadType = frame.PayloadType() case CloseFrame: return nil, io.EOF case PingFrame: pingMsg := make([]byte, maxControlFramePayloadLength) n, err := io.ReadFull(frame, pingMsg) if err != nil && err != io.ErrUnexpectedEOF { return nil, err } io.Copy(ioutil.Discard, frame) n, err = handler.WritePong(pingMsg[:n]) if err != nil { return nil, err } return nil, nil case PongFrame: return nil, ErrNotImplemented } return frame, nil } func (handler *hybiFrameHandler) WriteClose(status int) (err error) { handler.conn.wio.Lock() defer handler.conn.wio.Unlock() w, err := handler.conn.frameWriterFactory.NewFrameWriter(CloseFrame) if err != nil { return err } msg := make([]byte, 2) binary.BigEndian.PutUint16(msg, uint16(status)) _, err = w.Write(msg) w.Close() return err } func (handler *hybiFrameHandler) WritePong(msg []byte) (n int, err error) { handler.conn.wio.Lock() defer handler.conn.wio.Unlock() w, err := handler.conn.frameWriterFactory.NewFrameWriter(PongFrame) if err != nil { return 0, err } n, err = w.Write(msg) w.Close() return n, err } // newHybiConn creates a new WebSocket connection speaking hybi draft protocol. func newHybiConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { if buf == nil { br := bufio.NewReader(rwc) bw := bufio.NewWriter(rwc) buf = bufio.NewReadWriter(br, bw) } ws := &Conn{config: config, request: request, buf: buf, rwc: rwc, frameReaderFactory: hybiFrameReaderFactory{buf.Reader}, frameWriterFactory: hybiFrameWriterFactory{ buf.Writer, request == nil}, PayloadType: TextFrame, defaultCloseStatus: closeStatusNormal} ws.frameHandler = &hybiFrameHandler{conn: ws} return ws } // generateMaskingKey generates a masking key for a frame. func generateMaskingKey() (maskingKey []byte, err error) { maskingKey = make([]byte, 4) if _, err = io.ReadFull(rand.Reader, maskingKey); err != nil { return } return } // generateNonce generates a nonce consisting of a randomly selected 16-byte // value that has been base64-encoded. func generateNonce() (nonce []byte) { key := make([]byte, 16) if _, err := io.ReadFull(rand.Reader, key); err != nil { panic(err) } nonce = make([]byte, 24) base64.StdEncoding.Encode(nonce, key) return } // getNonceAccept computes the base64-encoded SHA-1 of the concatenation of // the nonce ("Sec-WebSocket-Key" value) with the websocket GUID string. func getNonceAccept(nonce []byte) (expected []byte, err error) { h := sha1.New() if _, err = h.Write(nonce); err != nil { return } if _, err = h.Write([]byte(websocketGUID)); err != nil { return } expected = make([]byte, 28) base64.StdEncoding.Encode(expected, h.Sum(nil)) return } // Client handshake described in draft-ietf-hybi-thewebsocket-protocol-17 func hybiClientHandshake(config *Config, br *bufio.Reader, bw *bufio.Writer) (err error) { bw.WriteString("GET " + config.Location.RequestURI() + " HTTP/1.1\r\n") bw.WriteString("Host: " + config.Location.Host + "\r\n") bw.WriteString("Upgrade: websocket\r\n") bw.WriteString("Connection: Upgrade\r\n") nonce := generateNonce() if config.handshakeData != nil { nonce = []byte(config.handshakeData["key"]) } bw.WriteString("Sec-WebSocket-Key: " + string(nonce) + "\r\n") bw.WriteString("Origin: " + strings.ToLower(config.Origin.String()) + "\r\n") if config.Version != ProtocolVersionHybi13 { return ErrBadProtocolVersion } bw.WriteString("Sec-WebSocket-Version: " + fmt.Sprintf("%d", config.Version) + "\r\n") if len(config.Protocol) > 0 { bw.WriteString("Sec-WebSocket-Protocol: " + strings.Join(config.Protocol, ", ") + "\r\n") } // TODO(ukai): send Sec-WebSocket-Extensions. err = config.Header.WriteSubset(bw, handshakeHeader) if err != nil { return err } bw.WriteString("\r\n") if err = bw.Flush(); err != nil { return err } resp, err := http.ReadResponse(br, &http.Request{Method: "GET"}) if err != nil { return err } if resp.StatusCode != 101 { return ErrBadStatus } if strings.ToLower(resp.Header.Get("Upgrade")) != "websocket" || strings.ToLower(resp.Header.Get("Connection")) != "upgrade" { return ErrBadUpgrade } expectedAccept, err := getNonceAccept(nonce) if err != nil { return err } if resp.Header.Get("Sec-WebSocket-Accept") != string(expectedAccept) { return ErrChallengeResponse } if resp.Header.Get("Sec-WebSocket-Extensions") != "" { return ErrUnsupportedExtensions } offeredProtocol := resp.Header.Get("Sec-WebSocket-Protocol") if offeredProtocol != "" { protocolMatched := false for i := 0; i < len(config.Protocol); i++ { if config.Protocol[i] == offeredProtocol { protocolMatched = true break } } if !protocolMatched { return ErrBadWebSocketProtocol } config.Protocol = []string{offeredProtocol} } return nil } // newHybiClientConn creates a client WebSocket connection after handshake. func newHybiClientConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser) *Conn { return newHybiConn(config, buf, rwc, nil) } // A HybiServerHandshaker performs a server handshake using hybi draft protocol. type hybiServerHandshaker struct { *Config accept []byte } func (c *hybiServerHandshaker) ReadHandshake(buf *bufio.Reader, req *http.Request) (code int, err error) { c.Version = ProtocolVersionHybi13 if req.Method != "GET" { return http.StatusMethodNotAllowed, ErrBadRequestMethod } // HTTP version can be safely ignored. if strings.ToLower(req.Header.Get("Upgrade")) != "websocket" || !strings.Contains(strings.ToLower(req.Header.Get("Connection")), "upgrade") { return http.StatusBadRequest, ErrNotWebSocket } key := req.Header.Get("Sec-Websocket-Key") if key == "" { return http.StatusBadRequest, ErrChallengeResponse } version := req.Header.Get("Sec-Websocket-Version") switch version { case "13": c.Version = ProtocolVersionHybi13 default: return http.StatusBadRequest, ErrBadWebSocketVersion } var scheme string if req.TLS != nil { scheme = "wss" } else { scheme = "ws" } c.Location, err = url.ParseRequestURI(scheme + "://" + req.Host + req.URL.RequestURI()) if err != nil { return http.StatusBadRequest, err } protocol := strings.TrimSpace(req.Header.Get("Sec-Websocket-Protocol")) if protocol != "" { protocols := strings.Split(protocol, ",") for i := 0; i < len(protocols); i++ { c.Protocol = append(c.Protocol, strings.TrimSpace(protocols[i])) } } c.accept, err = getNonceAccept([]byte(key)) if err != nil { return http.StatusInternalServerError, err } return http.StatusSwitchingProtocols, nil } // Origin parses Origin header in "req". // If origin is "null", returns (nil, nil). func Origin(config *Config, req *http.Request) (*url.URL, error) { var origin string switch config.Version { case ProtocolVersionHybi13: origin = req.Header.Get("Origin") } if origin == "null" { return nil, nil } return url.ParseRequestURI(origin) } func (c *hybiServerHandshaker) AcceptHandshake(buf *bufio.Writer) (err error) { if len(c.Protocol) > 0 { if len(c.Protocol) != 1 { // You need choose a Protocol in Handshake func in Server. return ErrBadWebSocketProtocol } } buf.WriteString("HTTP/1.1 101 Switching Protocols\r\n") buf.WriteString("Upgrade: websocket\r\n") buf.WriteString("Connection: Upgrade\r\n") buf.WriteString("Sec-WebSocket-Accept: " + string(c.accept) + "\r\n") if len(c.Protocol) > 0 { buf.WriteString("Sec-WebSocket-Protocol: " + c.Protocol[0] + "\r\n") } // TODO(ukai): send Sec-WebSocket-Extensions. if c.Header != nil { err := c.Header.WriteSubset(buf, handshakeHeader) if err != nil { return err } } buf.WriteString("\r\n") return buf.Flush() } func (c *hybiServerHandshaker) NewServerConn(buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { return newHybiServerConn(c.Config, buf, rwc, request) } // newHybiServerConn returns a new WebSocket connection speaking hybi draft protocol. func newHybiServerConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { return newHybiConn(config, buf, rwc, request) } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/websocket/client.go��������������������������������������������������������������������������0000644�0001751�0001751�00000004334�12235217213�015121� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// 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 websocket import ( "bufio" "crypto/tls" "io" "net" "net/http" "net/url" ) // DialError is an error that occurs while dialling a websocket server. type DialError struct { *Config Err error } func (e *DialError) Error() string { return "websocket.Dial " + e.Config.Location.String() + ": " + e.Err.Error() } // NewConfig creates a new WebSocket config for client connection. func NewConfig(server, origin string) (config *Config, err error) { config = new(Config) config.Version = ProtocolVersionHybi13 config.Location, err = url.ParseRequestURI(server) if err != nil { return } config.Origin, err = url.ParseRequestURI(origin) if err != nil { return } config.Header = http.Header(make(map[string][]string)) return } // NewClient creates a new WebSocket client connection over rwc. func NewClient(config *Config, rwc io.ReadWriteCloser) (ws *Conn, err error) { br := bufio.NewReader(rwc) bw := bufio.NewWriter(rwc) err = hybiClientHandshake(config, br, bw) if err != nil { return } buf := bufio.NewReadWriter(br, bw) ws = newHybiClientConn(config, buf, rwc) return } // Dial opens a new client connection to a WebSocket. func Dial(url_, protocol, origin string) (ws *Conn, err error) { config, err := NewConfig(url_, origin) if err != nil { return nil, err } if protocol != "" { config.Protocol = []string{protocol} } return DialConfig(config) } // DialConfig opens a new client connection to a WebSocket with a config. func DialConfig(config *Config) (ws *Conn, err error) { var client net.Conn if config.Location == nil { return nil, &DialError{config, ErrBadWebSocketLocation} } if config.Origin == nil { return nil, &DialError{config, ErrBadWebSocketOrigin} } switch config.Location.Scheme { case "ws": client, err = net.Dial("tcp", config.Location.Host) case "wss": client, err = tls.Dial("tcp", config.Location.Host, config.TlsConfig) default: err = ErrBadScheme } if err != nil { goto Error } ws, err = NewClient(config, client) if err != nil { goto Error } return Error: return nil, &DialError{config, err} } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/websocket/hybi_test.go�����������������������������������������������������������������������0000644�0001751�0001751�00000043207�12235217213�015637� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package websocket import ( "bufio" "bytes" "fmt" "io" "net/http" "net/url" "strings" "testing" ) // Test the getNonceAccept function with values in // http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17 func TestSecWebSocketAccept(t *testing.T) { nonce := []byte("dGhlIHNhbXBsZSBub25jZQ==") expected := []byte("s3pPLMBiTxaQ9kYGzzhZRbK+xOo=") accept, err := getNonceAccept(nonce) if err != nil { t.Errorf("getNonceAccept: returned error %v", err) return } if !bytes.Equal(expected, accept) { t.Errorf("getNonceAccept: expected %q got %q", expected, accept) } } func TestHybiClientHandshake(t *testing.T) { b := bytes.NewBuffer([]byte{}) bw := bufio.NewWriter(b) br := bufio.NewReader(strings.NewReader(`HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat `)) var err error config := new(Config) config.Location, err = url.ParseRequestURI("ws://server.example.com/chat") if err != nil { t.Fatal("location url", err) } config.Origin, err = url.ParseRequestURI("http://example.com") if err != nil { t.Fatal("origin url", err) } config.Protocol = append(config.Protocol, "chat") config.Protocol = append(config.Protocol, "superchat") config.Version = ProtocolVersionHybi13 config.handshakeData = map[string]string{ "key": "dGhlIHNhbXBsZSBub25jZQ==", } err = hybiClientHandshake(config, br, bw) if err != nil { t.Errorf("handshake failed: %v", err) } req, err := http.ReadRequest(bufio.NewReader(b)) if err != nil { t.Fatalf("read request: %v", err) } if req.Method != "GET" { t.Errorf("request method expected GET, but got %q", req.Method) } if req.URL.Path != "/chat" { t.Errorf("request path expected /chat, but got %q", req.URL.Path) } if req.Proto != "HTTP/1.1" { t.Errorf("request proto expected HTTP/1.1, but got %q", req.Proto) } if req.Host != "server.example.com" { t.Errorf("request Host expected server.example.com, but got %v", req.Host) } var expectedHeader = map[string]string{ "Connection": "Upgrade", "Upgrade": "websocket", "Sec-Websocket-Key": config.handshakeData["key"], "Origin": config.Origin.String(), "Sec-Websocket-Protocol": "chat, superchat", "Sec-Websocket-Version": fmt.Sprintf("%d", ProtocolVersionHybi13), } for k, v := range expectedHeader { if req.Header.Get(k) != v { t.Errorf(fmt.Sprintf("%s expected %q but got %q", k, v, req.Header.Get(k))) } } } func TestHybiClientHandshakeWithHeader(t *testing.T) { b := bytes.NewBuffer([]byte{}) bw := bufio.NewWriter(b) br := bufio.NewReader(strings.NewReader(`HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat `)) var err error config := new(Config) config.Location, err = url.ParseRequestURI("ws://server.example.com/chat") if err != nil { t.Fatal("location url", err) } config.Origin, err = url.ParseRequestURI("http://example.com") if err != nil { t.Fatal("origin url", err) } config.Protocol = append(config.Protocol, "chat") config.Protocol = append(config.Protocol, "superchat") config.Version = ProtocolVersionHybi13 config.Header = http.Header(make(map[string][]string)) config.Header.Add("User-Agent", "test") config.handshakeData = map[string]string{ "key": "dGhlIHNhbXBsZSBub25jZQ==", } err = hybiClientHandshake(config, br, bw) if err != nil { t.Errorf("handshake failed: %v", err) } req, err := http.ReadRequest(bufio.NewReader(b)) if err != nil { t.Fatalf("read request: %v", err) } if req.Method != "GET" { t.Errorf("request method expected GET, but got %q", req.Method) } if req.URL.Path != "/chat" { t.Errorf("request path expected /chat, but got %q", req.URL.Path) } if req.Proto != "HTTP/1.1" { t.Errorf("request proto expected HTTP/1.1, but got %q", req.Proto) } if req.Host != "server.example.com" { t.Errorf("request Host expected server.example.com, but got %v", req.Host) } var expectedHeader = map[string]string{ "Connection": "Upgrade", "Upgrade": "websocket", "Sec-Websocket-Key": config.handshakeData["key"], "Origin": config.Origin.String(), "Sec-Websocket-Protocol": "chat, superchat", "Sec-Websocket-Version": fmt.Sprintf("%d", ProtocolVersionHybi13), "User-Agent": "test", } for k, v := range expectedHeader { if req.Header.Get(k) != v { t.Errorf(fmt.Sprintf("%s expected %q but got %q", k, v, req.Header.Get(k))) } } } func TestHybiServerHandshake(t *testing.T) { config := new(Config) handshaker := &hybiServerHandshaker{Config: config} br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 `)) req, err := http.ReadRequest(br) if err != nil { t.Fatal("request", err) } code, err := handshaker.ReadHandshake(br, req) if err != nil { t.Errorf("handshake failed: %v", err) } if code != http.StatusSwitchingProtocols { t.Errorf("status expected %q but got %q", http.StatusSwitchingProtocols, code) } expectedProtocols := []string{"chat", "superchat"} if fmt.Sprintf("%v", config.Protocol) != fmt.Sprintf("%v", expectedProtocols) { t.Errorf("protocol expected %q but got %q", expectedProtocols, config.Protocol) } b := bytes.NewBuffer([]byte{}) bw := bufio.NewWriter(b) config.Protocol = config.Protocol[:1] err = handshaker.AcceptHandshake(bw) if err != nil { t.Errorf("handshake response failed: %v", err) } expectedResponse := strings.Join([]string{ "HTTP/1.1 101 Switching Protocols", "Upgrade: websocket", "Connection: Upgrade", "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", "Sec-WebSocket-Protocol: chat", "", ""}, "\r\n") if b.String() != expectedResponse { t.Errorf("handshake expected %q but got %q", expectedResponse, b.String()) } } func TestHybiServerHandshakeNoSubProtocol(t *testing.T) { config := new(Config) handshaker := &hybiServerHandshaker{Config: config} br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com Sec-WebSocket-Version: 13 `)) req, err := http.ReadRequest(br) if err != nil { t.Fatal("request", err) } code, err := handshaker.ReadHandshake(br, req) if err != nil { t.Errorf("handshake failed: %v", err) } if code != http.StatusSwitchingProtocols { t.Errorf("status expected %q but got %q", http.StatusSwitchingProtocols, code) } if len(config.Protocol) != 0 { t.Errorf("len(config.Protocol) expected 0, but got %q", len(config.Protocol)) } b := bytes.NewBuffer([]byte{}) bw := bufio.NewWriter(b) err = handshaker.AcceptHandshake(bw) if err != nil { t.Errorf("handshake response failed: %v", err) } expectedResponse := strings.Join([]string{ "HTTP/1.1 101 Switching Protocols", "Upgrade: websocket", "Connection: Upgrade", "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", "", ""}, "\r\n") if b.String() != expectedResponse { t.Errorf("handshake expected %q but got %q", expectedResponse, b.String()) } } func TestHybiServerHandshakeHybiBadVersion(t *testing.T) { config := new(Config) handshaker := &hybiServerHandshaker{Config: config} br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Origin: http://example.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 9 `)) req, err := http.ReadRequest(br) if err != nil { t.Fatal("request", err) } code, err := handshaker.ReadHandshake(br, req) if err != ErrBadWebSocketVersion { t.Errorf("handshake expected err %q but got %q", ErrBadWebSocketVersion, err) } if code != http.StatusBadRequest { t.Errorf("status expected %q but got %q", http.StatusBadRequest, code) } } func testHybiFrame(t *testing.T, testHeader, testPayload, testMaskedPayload []byte, frameHeader *hybiFrameHeader) { b := bytes.NewBuffer([]byte{}) frameWriterFactory := &hybiFrameWriterFactory{bufio.NewWriter(b), false} w, _ := frameWriterFactory.NewFrameWriter(TextFrame) w.(*hybiFrameWriter).header = frameHeader _, err := w.Write(testPayload) w.Close() if err != nil { t.Errorf("Write error %q", err) } var expectedFrame []byte expectedFrame = append(expectedFrame, testHeader...) expectedFrame = append(expectedFrame, testMaskedPayload...) if !bytes.Equal(expectedFrame, b.Bytes()) { t.Errorf("frame expected %q got %q", expectedFrame, b.Bytes()) } frameReaderFactory := &hybiFrameReaderFactory{bufio.NewReader(b)} r, err := frameReaderFactory.NewFrameReader() if err != nil { t.Errorf("Read error %q", err) } if header := r.HeaderReader(); header == nil { t.Errorf("no header") } else { actualHeader := make([]byte, r.Len()) n, err := header.Read(actualHeader) if err != nil { t.Errorf("Read header error %q", err) } else { if n < len(testHeader) { t.Errorf("header too short %q got %q", testHeader, actualHeader[:n]) } if !bytes.Equal(testHeader, actualHeader[:n]) { t.Errorf("header expected %q got %q", testHeader, actualHeader[:n]) } } } if trailer := r.TrailerReader(); trailer != nil { t.Errorf("unexpected trailer %q", trailer) } frame := r.(*hybiFrameReader) if frameHeader.Fin != frame.header.Fin || frameHeader.OpCode != frame.header.OpCode || len(testPayload) != int(frame.header.Length) { t.Errorf("mismatch %v (%d) vs %v", frameHeader, len(testPayload), frame) } payload := make([]byte, len(testPayload)) _, err = r.Read(payload) if err != nil { t.Errorf("read %v", err) } if !bytes.Equal(testPayload, payload) { t.Errorf("payload %q vs %q", testPayload, payload) } } func TestHybiShortTextFrame(t *testing.T) { frameHeader := &hybiFrameHeader{Fin: true, OpCode: TextFrame} payload := []byte("hello") testHybiFrame(t, []byte{0x81, 0x05}, payload, payload, frameHeader) payload = make([]byte, 125) testHybiFrame(t, []byte{0x81, 125}, payload, payload, frameHeader) } func TestHybiShortMaskedTextFrame(t *testing.T) { frameHeader := &hybiFrameHeader{Fin: true, OpCode: TextFrame, MaskingKey: []byte{0xcc, 0x55, 0x80, 0x20}} payload := []byte("hello") maskedPayload := []byte{0xa4, 0x30, 0xec, 0x4c, 0xa3} header := []byte{0x81, 0x85} header = append(header, frameHeader.MaskingKey...) testHybiFrame(t, header, payload, maskedPayload, frameHeader) } func TestHybiShortBinaryFrame(t *testing.T) { frameHeader := &hybiFrameHeader{Fin: true, OpCode: BinaryFrame} payload := []byte("hello") testHybiFrame(t, []byte{0x82, 0x05}, payload, payload, frameHeader) payload = make([]byte, 125) testHybiFrame(t, []byte{0x82, 125}, payload, payload, frameHeader) } func TestHybiControlFrame(t *testing.T) { frameHeader := &hybiFrameHeader{Fin: true, OpCode: PingFrame} payload := []byte("hello") testHybiFrame(t, []byte{0x89, 0x05}, payload, payload, frameHeader) frameHeader = &hybiFrameHeader{Fin: true, OpCode: PongFrame} testHybiFrame(t, []byte{0x8A, 0x05}, payload, payload, frameHeader) frameHeader = &hybiFrameHeader{Fin: true, OpCode: CloseFrame} payload = []byte{0x03, 0xe8} // 1000 testHybiFrame(t, []byte{0x88, 0x02}, payload, payload, frameHeader) } func TestHybiLongFrame(t *testing.T) { frameHeader := &hybiFrameHeader{Fin: true, OpCode: TextFrame} payload := make([]byte, 126) testHybiFrame(t, []byte{0x81, 126, 0x00, 126}, payload, payload, frameHeader) payload = make([]byte, 65535) testHybiFrame(t, []byte{0x81, 126, 0xff, 0xff}, payload, payload, frameHeader) payload = make([]byte, 65536) testHybiFrame(t, []byte{0x81, 127, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00}, payload, payload, frameHeader) } func TestHybiClientRead(t *testing.T) { wireData := []byte{0x81, 0x05, 'h', 'e', 'l', 'l', 'o', 0x89, 0x05, 'h', 'e', 'l', 'l', 'o', // ping 0x81, 0x05, 'w', 'o', 'r', 'l', 'd'} br := bufio.NewReader(bytes.NewBuffer(wireData)) bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, nil) msg := make([]byte, 512) n, err := conn.Read(msg) if err != nil { t.Errorf("read 1st frame, error %q", err) } if n != 5 { t.Errorf("read 1st frame, expect 5, got %d", n) } if !bytes.Equal(wireData[2:7], msg[:n]) { t.Errorf("read 1st frame %v, got %v", wireData[2:7], msg[:n]) } n, err = conn.Read(msg) if err != nil { t.Errorf("read 2nd frame, error %q", err) } if n != 5 { t.Errorf("read 2nd frame, expect 5, got %d", n) } if !bytes.Equal(wireData[16:21], msg[:n]) { t.Errorf("read 2nd frame %v, got %v", wireData[16:21], msg[:n]) } n, err = conn.Read(msg) if err == nil { t.Errorf("read not EOF") } if n != 0 { t.Errorf("expect read 0, got %d", n) } } func TestHybiShortRead(t *testing.T) { wireData := []byte{0x81, 0x05, 'h', 'e', 'l', 'l', 'o', 0x89, 0x05, 'h', 'e', 'l', 'l', 'o', // ping 0x81, 0x05, 'w', 'o', 'r', 'l', 'd'} br := bufio.NewReader(bytes.NewBuffer(wireData)) bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, nil) step := 0 pos := 0 expectedPos := []int{2, 5, 16, 19} expectedLen := []int{3, 2, 3, 2} for { msg := make([]byte, 3) n, err := conn.Read(msg) if step >= len(expectedPos) { if err == nil { t.Errorf("read not EOF") } if n != 0 { t.Errorf("expect read 0, got %d", n) } return } pos = expectedPos[step] endPos := pos + expectedLen[step] if err != nil { t.Errorf("read from %d, got error %q", pos, err) return } if n != endPos-pos { t.Errorf("read from %d, expect %d, got %d", pos, endPos-pos, n) } if !bytes.Equal(wireData[pos:endPos], msg[:n]) { t.Errorf("read from %d, frame %v, got %v", pos, wireData[pos:endPos], msg[:n]) } step++ } } func TestHybiServerRead(t *testing.T) { wireData := []byte{0x81, 0x85, 0xcc, 0x55, 0x80, 0x20, 0xa4, 0x30, 0xec, 0x4c, 0xa3, // hello 0x89, 0x85, 0xcc, 0x55, 0x80, 0x20, 0xa4, 0x30, 0xec, 0x4c, 0xa3, // ping: hello 0x81, 0x85, 0xed, 0x83, 0xb4, 0x24, 0x9a, 0xec, 0xc6, 0x48, 0x89, // world } br := bufio.NewReader(bytes.NewBuffer(wireData)) bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, new(http.Request)) expected := [][]byte{[]byte("hello"), []byte("world")} msg := make([]byte, 512) n, err := conn.Read(msg) if err != nil { t.Errorf("read 1st frame, error %q", err) } if n != 5 { t.Errorf("read 1st frame, expect 5, got %d", n) } if !bytes.Equal(expected[0], msg[:n]) { t.Errorf("read 1st frame %q, got %q", expected[0], msg[:n]) } n, err = conn.Read(msg) if err != nil { t.Errorf("read 2nd frame, error %q", err) } if n != 5 { t.Errorf("read 2nd frame, expect 5, got %d", n) } if !bytes.Equal(expected[1], msg[:n]) { t.Errorf("read 2nd frame %q, got %q", expected[1], msg[:n]) } n, err = conn.Read(msg) if err == nil { t.Errorf("read not EOF") } if n != 0 { t.Errorf("expect read 0, got %d", n) } } func TestHybiServerReadWithoutMasking(t *testing.T) { wireData := []byte{0x81, 0x05, 'h', 'e', 'l', 'l', 'o'} br := bufio.NewReader(bytes.NewBuffer(wireData)) bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, new(http.Request)) // server MUST close the connection upon receiving a non-masked frame. msg := make([]byte, 512) _, err := conn.Read(msg) if err != io.EOF { t.Errorf("read 1st frame, expect %q, but got %q", io.EOF, err) } } func TestHybiClientReadWithMasking(t *testing.T) { wireData := []byte{0x81, 0x85, 0xcc, 0x55, 0x80, 0x20, 0xa4, 0x30, 0xec, 0x4c, 0xa3, // hello } br := bufio.NewReader(bytes.NewBuffer(wireData)) bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, nil) // client MUST close the connection upon receiving a masked frame. msg := make([]byte, 512) _, err := conn.Read(msg) if err != io.EOF { t.Errorf("read 1st frame, expect %q, but got %q", io.EOF, err) } } // Test the hybiServerHandshaker supports firefox implementation and // checks Connection request header include (but it's not necessary // equal to) "upgrade" func TestHybiServerFirefoxHandshake(t *testing.T) { config := new(Config) handshaker := &hybiServerHandshaker{Config: config} br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: keep-alive, upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 `)) req, err := http.ReadRequest(br) if err != nil { t.Fatal("request", err) } code, err := handshaker.ReadHandshake(br, req) if err != nil { t.Errorf("handshake failed: %v", err) } if code != http.StatusSwitchingProtocols { t.Errorf("status expected %q but got %q", http.StatusSwitchingProtocols, code) } b := bytes.NewBuffer([]byte{}) bw := bufio.NewWriter(b) config.Protocol = []string{"chat"} err = handshaker.AcceptHandshake(bw) if err != nil { t.Errorf("handshake response failed: %v", err) } expectedResponse := strings.Join([]string{ "HTTP/1.1 101 Switching Protocols", "Upgrade: websocket", "Connection: Upgrade", "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", "Sec-WebSocket-Protocol: chat", "", ""}, "\r\n") if b.String() != expectedResponse { t.Errorf("handshake expected %q but got %q", expectedResponse, b.String()) } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/websocket/websocket.go�����������������������������������������������������������������������0000644�0001751�0001751�00000024470�12235217213�015634� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// 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 websocket implements a client and server for the WebSocket protocol // as specified in RFC 6455. package websocket import ( "bufio" "crypto/tls" "encoding/json" "errors" "io" "io/ioutil" "net" "net/http" "net/url" "sync" "time" ) const ( ProtocolVersionHybi13 = 13 ProtocolVersionHybi = ProtocolVersionHybi13 SupportedProtocolVersion = "13" ContinuationFrame = 0 TextFrame = 1 BinaryFrame = 2 CloseFrame = 8 PingFrame = 9 PongFrame = 10 UnknownFrame = 255 ) // ProtocolError represents WebSocket protocol errors. type ProtocolError struct { ErrorString string } func (err *ProtocolError) Error() string { return err.ErrorString } var ( ErrBadProtocolVersion = &ProtocolError{"bad protocol version"} ErrBadScheme = &ProtocolError{"bad scheme"} ErrBadStatus = &ProtocolError{"bad status"} ErrBadUpgrade = &ProtocolError{"missing or bad upgrade"} ErrBadWebSocketOrigin = &ProtocolError{"missing or bad WebSocket-Origin"} ErrBadWebSocketLocation = &ProtocolError{"missing or bad WebSocket-Location"} ErrBadWebSocketProtocol = &ProtocolError{"missing or bad WebSocket-Protocol"} ErrBadWebSocketVersion = &ProtocolError{"missing or bad WebSocket Version"} ErrChallengeResponse = &ProtocolError{"mismatch challenge/response"} ErrBadFrame = &ProtocolError{"bad frame"} ErrBadFrameBoundary = &ProtocolError{"not on frame boundary"} ErrNotWebSocket = &ProtocolError{"not websocket protocol"} ErrBadRequestMethod = &ProtocolError{"bad method"} ErrNotSupported = &ProtocolError{"not supported"} ) // Addr is an implementation of net.Addr for WebSocket. type Addr struct { *url.URL } // Network returns the network type for a WebSocket, "websocket". func (addr *Addr) Network() string { return "websocket" } // Config is a WebSocket configuration type Config struct { // A WebSocket server address. Location *url.URL // A Websocket client origin. Origin *url.URL // WebSocket subprotocols. Protocol []string // WebSocket protocol version. Version int // TLS config for secure WebSocket (wss). TlsConfig *tls.Config // Additional header fields to be sent in WebSocket opening handshake. Header http.Header handshakeData map[string]string } // serverHandshaker is an interface to handle WebSocket server side handshake. type serverHandshaker interface { // ReadHandshake reads handshake request message from client. // Returns http response code and error if any. ReadHandshake(buf *bufio.Reader, req *http.Request) (code int, err error) // AcceptHandshake accepts the client handshake request and sends // handshake response back to client. AcceptHandshake(buf *bufio.Writer) (err error) // NewServerConn creates a new WebSocket connection. NewServerConn(buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) (conn *Conn) } // frameReader is an interface to read a WebSocket frame. type frameReader interface { // Reader is to read payload of the frame. io.Reader // PayloadType returns payload type. PayloadType() byte // HeaderReader returns a reader to read header of the frame. HeaderReader() io.Reader // TrailerReader returns a reader to read trailer of the frame. // If it returns nil, there is no trailer in the frame. TrailerReader() io.Reader // Len returns total length of the frame, including header and trailer. Len() int } // frameReaderFactory is an interface to creates new frame reader. type frameReaderFactory interface { NewFrameReader() (r frameReader, err error) } // frameWriter is an interface to write a WebSocket frame. type frameWriter interface { // Writer is to write playload of the frame. io.WriteCloser } // frameWriterFactory is an interface to create new frame writer. type frameWriterFactory interface { NewFrameWriter(payloadType byte) (w frameWriter, err error) } type frameHandler interface { HandleFrame(frame frameReader) (r frameReader, err error) WriteClose(status int) (err error) } // Conn represents a WebSocket connection. type Conn struct { config *Config request *http.Request buf *bufio.ReadWriter rwc io.ReadWriteCloser rio sync.Mutex frameReaderFactory frameReader wio sync.Mutex frameWriterFactory frameHandler PayloadType byte defaultCloseStatus int } // Read implements the io.Reader interface: // it reads data of a frame from the WebSocket connection. // if msg is not large enough for the frame data, it fills the msg and next Read // will read the rest of the frame data. // it reads Text frame or Binary frame. func (ws *Conn) Read(msg []byte) (n int, err error) { ws.rio.Lock() defer ws.rio.Unlock() again: if ws.frameReader == nil { frame, err := ws.frameReaderFactory.NewFrameReader() if err != nil { return 0, err } ws.frameReader, err = ws.frameHandler.HandleFrame(frame) if err != nil { return 0, err } if ws.frameReader == nil { goto again } } n, err = ws.frameReader.Read(msg) if err == io.EOF { if trailer := ws.frameReader.TrailerReader(); trailer != nil { io.Copy(ioutil.Discard, trailer) } ws.frameReader = nil goto again } return n, err } // Write implements the io.Writer interface: // it writes data as a frame to the WebSocket connection. func (ws *Conn) Write(msg []byte) (n int, err error) { ws.wio.Lock() defer ws.wio.Unlock() w, err := ws.frameWriterFactory.NewFrameWriter(ws.PayloadType) if err != nil { return 0, err } n, err = w.Write(msg) w.Close() if err != nil { return n, err } return n, err } // Close implements the io.Closer interface. func (ws *Conn) Close() error { err := ws.frameHandler.WriteClose(ws.defaultCloseStatus) if err != nil { return err } return ws.rwc.Close() } func (ws *Conn) IsClientConn() bool { return ws.request == nil } func (ws *Conn) IsServerConn() bool { return ws.request != nil } // LocalAddr returns the WebSocket Origin for the connection for client, or // the WebSocket location for server. func (ws *Conn) LocalAddr() net.Addr { if ws.IsClientConn() { return &Addr{ws.config.Origin} } return &Addr{ws.config.Location} } // RemoteAddr returns the WebSocket location for the connection for client, or // the Websocket Origin for server. func (ws *Conn) RemoteAddr() net.Addr { if ws.IsClientConn() { return &Addr{ws.config.Location} } return &Addr{ws.config.Origin} } var errSetDeadline = errors.New("websocket: cannot set deadline: not using a net.Conn") // SetDeadline sets the connection's network read & write deadlines. func (ws *Conn) SetDeadline(t time.Time) error { if conn, ok := ws.rwc.(net.Conn); ok { return conn.SetDeadline(t) } return errSetDeadline } // SetReadDeadline sets the connection's network read deadline. func (ws *Conn) SetReadDeadline(t time.Time) error { if conn, ok := ws.rwc.(net.Conn); ok { return conn.SetReadDeadline(t) } return errSetDeadline } // SetWriteDeadline sets the connection's network write deadline. func (ws *Conn) SetWriteDeadline(t time.Time) error { if conn, ok := ws.rwc.(net.Conn); ok { return conn.SetWriteDeadline(t) } return errSetDeadline } // Config returns the WebSocket config. func (ws *Conn) Config() *Config { return ws.config } // Request returns the http request upgraded to the WebSocket. // It is nil for client side. func (ws *Conn) Request() *http.Request { return ws.request } // Codec represents a symmetric pair of functions that implement a codec. type Codec struct { Marshal func(v interface{}) (data []byte, payloadType byte, err error) Unmarshal func(data []byte, payloadType byte, v interface{}) (err error) } // Send sends v marshaled by cd.Marshal as single frame to ws. func (cd Codec) Send(ws *Conn, v interface{}) (err error) { data, payloadType, err := cd.Marshal(v) if err != nil { return err } ws.wio.Lock() defer ws.wio.Unlock() w, err := ws.frameWriterFactory.NewFrameWriter(payloadType) if err != nil { return err } _, err = w.Write(data) w.Close() return err } // Receive receives single frame from ws, unmarshaled by cd.Unmarshal and stores in v. func (cd Codec) Receive(ws *Conn, v interface{}) (err error) { ws.rio.Lock() defer ws.rio.Unlock() if ws.frameReader != nil { _, err = io.Copy(ioutil.Discard, ws.frameReader) if err != nil { return err } ws.frameReader = nil } again: frame, err := ws.frameReaderFactory.NewFrameReader() if err != nil { return err } frame, err = ws.frameHandler.HandleFrame(frame) if err != nil { return err } if frame == nil { goto again } payloadType := frame.PayloadType() data, err := ioutil.ReadAll(frame) if err != nil { return err } return cd.Unmarshal(data, payloadType, v) } func marshal(v interface{}) (msg []byte, payloadType byte, err error) { switch data := v.(type) { case string: return []byte(data), TextFrame, nil case []byte: return data, BinaryFrame, nil } return nil, UnknownFrame, ErrNotSupported } func unmarshal(msg []byte, payloadType byte, v interface{}) (err error) { switch data := v.(type) { case *string: *data = string(msg) return nil case *[]byte: *data = msg return nil } return ErrNotSupported } /* Message is a codec to send/receive text/binary data in a frame on WebSocket connection. To send/receive text frame, use string type. To send/receive binary frame, use []byte type. Trivial usage: import "websocket" // receive text frame var message string websocket.Message.Receive(ws, &message) // send text frame message = "hello" websocket.Message.Send(ws, message) // receive binary frame var data []byte websocket.Message.Receive(ws, &data) // send binary frame data = []byte{0, 1, 2} websocket.Message.Send(ws, data) */ var Message = Codec{marshal, unmarshal} func jsonMarshal(v interface{}) (msg []byte, payloadType byte, err error) { msg, err = json.Marshal(v) return msg, TextFrame, err } func jsonUnmarshal(msg []byte, payloadType byte, v interface{}) (err error) { return json.Unmarshal(msg, v) } /* JSON is a codec to send/receive JSON data in a frame from a WebSocket connection. Trivial usage: import "websocket" type T struct { Msg string Count int } // receive JSON type T var data T websocket.JSON.Receive(ws, &data) // send JSON type T websocket.JSON.Send(ws, data) */ var JSON = Codec{jsonMarshal, jsonUnmarshal} ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/websocket/exampledial_test.go����������������������������������������������������������������0000644�0001751�0001751�00000001261�12235217213�017163� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// 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. package websocket_test import ( "fmt" "log" "code.google.com/p/go.net/websocket" ) // This example demonstrates a trivial client. func ExampleDial() { origin := "http://localhost/" url := "ws://localhost:12345/ws" ws, err := websocket.Dial(url, "", origin) if err != nil { log.Fatal(err) } if _, err := ws.Write([]byte("hello, world!\n")); err != nil { log.Fatal(err) } var msg = make([]byte, 512) var n int if n, err = ws.Read(msg); err != nil { log.Fatal(err) } fmt.Printf("Received: %s.\n", msg[:n]) } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/CONTRIBUTORS���������������������������������������������������������������������������������0000644�0001751�0001751�00000000252�12235217213�013201� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This source code was written by the Go contributors. # The master list of contributors is in the main Go distribution, # visible at http://tip.golang.org/CONTRIBUTORS. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/PATENTS��������������������������������������������������������������������������������������0000644�0001751�0001751�00000002427�12235217213�012370� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Additional IP Rights Grant (Patents) "This implementation" means the copyrightable works distributed by Google as part of the Go project. Google hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, transfer and otherwise run, modify and propagate the contents of this implementation of Go, where such license applies only to those patent claims, both currently owned or controlled by Google and acquired in the future, licensable by Google that are necessarily infringed by this implementation of Go. This grant does not include claims that would be infringed only as a consequence of further modification of this implementation. If you or your agent or exclusive licensee institute or order or agree to the institution of patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that this implementation of Go or any code incorporated within this implementation of Go constitutes direct or contributory patent infringement, or inducement of patent infringement, then any patent rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/����������������������������������������������������������������������������������������0000755�0001751�0001751�00000000000�12235217213�012206� 5����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/sockopt_rfc3542_linux.go����������������������������������������������������������������0000644�0001751�0001751�00000002443�12235217213�016611� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import ( "os" "syscall" ) func ipv6PathMTU(fd int) (int, error) { v, err := syscall.GetsockoptIPv6MTUInfo(fd, ianaProtocolIPv6, syscall_IPV6_PATHMTU) if err != nil { return 0, os.NewSyscallError("getsockopt", err) } return int(v.Mtu), nil } func ipv6ReceivePathMTU(fd int) (bool, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIPv6, syscall_IPV6_RECVPATHMTU) if err != nil { return false, os.NewSyscallError("getsockopt", err) } return v == 1, nil } func setIPv6ReceivePathMTU(fd int, v bool) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIPv6, syscall_IPV6_RECVPATHMTU, boolint(v))) } func ipv6ICMPFilter(fd int) (*ICMPFilter, error) { v, err := syscall.GetsockoptICMPv6Filter(fd, ianaProtocolIPv6ICMP, syscall.ICMPV6_FILTER) if err != nil { return nil, os.NewSyscallError("getsockopt", err) } return &ICMPFilter{rawICMPFilter: rawICMPFilter{*v}}, nil } func setIPv6ICMPFilter(fd int, f *ICMPFilter) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptICMPv6Filter(fd, ianaProtocolIPv6ICMP, syscall.ICMPV6_FILTER, &f.rawICMPFilter.ICMPv6Filter)) } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/sockopt_rfc3493_bsd.go������������������������������������������������������������������0000644�0001751�0001751�00000000701�12235217213�016222� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin freebsd netbsd openbsd package ipv6 import ( "os" "syscall" ) func setIPv6Checksum(fd int, on bool, offset int) error { if !on { offset = -1 } return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_CHECKSUM, offset)) } ���������������������������������������������������������������go.net/ipv6/helper_unix.go��������������������������������������������������������������������������0000644�0001751�0001751�00000002003�12235217213�015052� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin freebsd linux netbsd openbsd package ipv6 import ( "net" "reflect" ) func (c *genericOpt) sysfd() (int, error) { switch p := c.Conn.(type) { case *net.TCPConn, *net.UDPConn, *net.IPConn: return sysfd(p) } return 0, errInvalidConnType } func (c *dgramOpt) sysfd() (int, error) { switch p := c.PacketConn.(type) { case *net.UDPConn, *net.IPConn: return sysfd(p.(net.Conn)) } return 0, errInvalidConnType } func (c *payloadHandler) sysfd() (int, error) { return sysfd(c.PacketConn.(net.Conn)) } func sysfd(c net.Conn) (int, error) { cv := reflect.ValueOf(c) switch ce := cv.Elem(); ce.Kind() { case reflect.Struct: nfd := ce.FieldByName("conn").FieldByName("fd") switch fe := nfd.Elem(); fe.Kind() { case reflect.Struct: fd := fe.FieldByName("sysfd") return int(fd.Int()), nil } } return 0, errInvalidConnType } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/iana.go���������������������������������������������������������������������������������0000644�0001751�0001751�00000031060�12235217213�013445� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// go run gen.go // GENERATED BY THE COMMAND ABOVE; DO NOT EDIT package ipv6 // Internet Control Message Protocol version 6 (ICMPv6) Parameters, Updated: 2013-07-03 const ( ICMPTypeDestinationUnreachable ICMPType = 1 // Destination Unreachable ICMPTypePacketTooBig ICMPType = 2 // Packet Too Big ICMPTypeTimeExceeded ICMPType = 3 // Time Exceeded ICMPTypeParameterProblem ICMPType = 4 // Parameter Problem ICMPTypeEchoRequest ICMPType = 128 // Echo Request ICMPTypeEchoReply ICMPType = 129 // Echo Reply ICMPTypeMulticastListenerQuery ICMPType = 130 // Multicast Listener Query ICMPTypeMulticastListenerReport ICMPType = 131 // Multicast Listener Report ICMPTypeMulticastListenerDone ICMPType = 132 // Multicast Listener Done ICMPTypeRouterSolicitation ICMPType = 133 // Router Solicitation ICMPTypeRouterAdvertisement ICMPType = 134 // Router Advertisement ICMPTypeNeighborSolicitation ICMPType = 135 // Neighbor Solicitation ICMPTypeNeighborAdvertisement ICMPType = 136 // Neighbor Advertisement ICMPTypeRedirect ICMPType = 137 // Redirect Message ICMPTypeRouterRenumbering ICMPType = 138 // Router Renumbering ICMPTypeNodeInformationQuery ICMPType = 139 // ICMP Node Information Query ICMPTypeNodeInformationResponse ICMPType = 140 // ICMP Node Information Response ICMPTypeInverseNeighborDiscoverySolicitation ICMPType = 141 // Inverse Neighbor Discovery Solicitation Message ICMPTypeInverseNeighborDiscoveryAdvertisement ICMPType = 142 // Inverse Neighbor Discovery Advertisement Message ICMPTypeVersion2MulticastListenerReport ICMPType = 143 // Version 2 Multicast Listener Report ICMPTypeHomeAgentAddressDiscoveryRequest ICMPType = 144 // Home Agent Address Discovery Request Message ICMPTypeHomeAgentAddressDiscoveryReply ICMPType = 145 // Home Agent Address Discovery Reply Message ICMPTypeMobilePrefixSolicitation ICMPType = 146 // Mobile Prefix Solicitation ICMPTypeMobilePrefixAdvertisement ICMPType = 147 // Mobile Prefix Advertisement ICMPTypeCertificationPathSolicitation ICMPType = 148 // Certification Path Solicitation Message ICMPTypeCertificationPathAdvertisement ICMPType = 149 // Certification Path Advertisement Message ICMPTypeMulticastRouterAdvertisement ICMPType = 151 // Multicast Router Advertisement ICMPTypeMulticastRouterSolicitation ICMPType = 152 // Multicast Router Solicitation ICMPTypeMulticastRouterTermination ICMPType = 153 // Multicast Router Termination ICMPTypeFMIPv6 ICMPType = 154 // FMIPv6 Messages ICMPTypeRPLControl ICMPType = 155 // RPL Control Message ICMPTypeILNPv6LocatorUpdate ICMPType = 156 // ILNPv6 Locator Update Message ICMPTypeDuplicateAddressRequest ICMPType = 157 // Duplicate Address Request ICMPTypeDuplicateAddressConfirmation ICMPType = 158 // Duplicate Address Confirmation ) // Internet Control Message Protocol version 6 (ICMPv6) Parameters, Updated: 2013-07-03 var icmpTypes = map[ICMPType]string{ 1: "destination unreachable", 2: "packet too big", 3: "time exceeded", 4: "parameter problem", 128: "echo request", 129: "echo reply", 130: "multicast listener query", 131: "multicast listener report", 132: "multicast listener done", 133: "router solicitation", 134: "router advertisement", 135: "neighbor solicitation", 136: "neighbor advertisement", 137: "redirect message", 138: "router renumbering", 139: "icmp node information query", 140: "icmp node information response", 141: "inverse neighbor discovery solicitation message", 142: "inverse neighbor discovery advertisement message", 143: "version 2 multicast listener report", 144: "home agent address discovery request message", 145: "home agent address discovery reply message", 146: "mobile prefix solicitation", 147: "mobile prefix advertisement", 148: "certification path solicitation message", 149: "certification path advertisement message", 151: "multicast router advertisement", 152: "multicast router solicitation", 153: "multicast router termination", 154: "fmipv6 messages", 155: "rpl control message", 156: "ilnpv6 locator update message", 157: "duplicate address request", 158: "duplicate address confirmation", } // Protocol Numbers, Updated: 2013-02-17 const ( ianaProtocolHOPOPT = 0 // IPv6 Hop-by-Hop Option ianaProtocolICMP = 1 // Internet Control Message ianaProtocolIGMP = 2 // Internet Group Management ianaProtocolGGP = 3 // Gateway-to-Gateway ianaProtocolIPv4 = 4 // IPv4 encapsulation ianaProtocolST = 5 // Stream ianaProtocolTCP = 6 // Transmission Control ianaProtocolCBT = 7 // CBT ianaProtocolEGP = 8 // Exterior Gateway Protocol ianaProtocolIGP = 9 // any private interior gateway (used by Cisco for their IGRP) ianaProtocolBBNRCCMON = 10 // BBN RCC Monitoring ianaProtocolNVPII = 11 // Network Voice Protocol ianaProtocolPUP = 12 // PUP ianaProtocolARGUS = 13 // ARGUS ianaProtocolEMCON = 14 // EMCON ianaProtocolXNET = 15 // Cross Net Debugger ianaProtocolCHAOS = 16 // Chaos ianaProtocolUDP = 17 // User Datagram ianaProtocolMUX = 18 // Multiplexing ianaProtocolDCNMEAS = 19 // DCN Measurement Subsystems ianaProtocolHMP = 20 // Host Monitoring ianaProtocolPRM = 21 // Packet Radio Measurement ianaProtocolXNSIDP = 22 // XEROX NS IDP ianaProtocolTRUNK1 = 23 // Trunk-1 ianaProtocolTRUNK2 = 24 // Trunk-2 ianaProtocolLEAF1 = 25 // Leaf-1 ianaProtocolLEAF2 = 26 // Leaf-2 ianaProtocolRDP = 27 // Reliable Data Protocol ianaProtocolIRTP = 28 // Internet Reliable Transaction ianaProtocolISOTP4 = 29 // ISO Transport Protocol Class 4 ianaProtocolNETBLT = 30 // Bulk Data Transfer Protocol ianaProtocolMFENSP = 31 // MFE Network Services Protocol ianaProtocolMERITINP = 32 // MERIT Internodal Protocol ianaProtocolDCCP = 33 // Datagram Congestion Control Protocol ianaProtocol3PC = 34 // Third Party Connect Protocol ianaProtocolIDPR = 35 // Inter-Domain Policy Routing Protocol ianaProtocolXTP = 36 // XTP ianaProtocolDDP = 37 // Datagram Delivery Protocol ianaProtocolIDPRCMTP = 38 // IDPR Control Message Transport Proto ianaProtocolTPPP = 39 // TP++ Transport Protocol ianaProtocolIL = 40 // IL Transport Protocol ianaProtocolIPv6 = 41 // IPv6 encapsulation ianaProtocolSDRP = 42 // Source Demand Routing Protocol ianaProtocolIPv6Route = 43 // Routing Header for IPv6 ianaProtocolIPv6Frag = 44 // Fragment Header for IPv6 ianaProtocolIDRP = 45 // Inter-Domain Routing Protocol ianaProtocolRSVP = 46 // Reservation Protocol ianaProtocolGRE = 47 // Generic Routing Encapsulation ianaProtocolDSR = 48 // Dynamic Source Routing Protocol ianaProtocolBNA = 49 // BNA ianaProtocolESP = 50 // Encap Security Payload ianaProtocolAH = 51 // Authentication Header ianaProtocolINLSP = 52 // Integrated Net Layer Security TUBA ianaProtocolSWIPE = 53 // IP with Encryption ianaProtocolNARP = 54 // NBMA Address Resolution Protocol ianaProtocolMOBILE = 55 // IP Mobility ianaProtocolTLSP = 56 // Transport Layer Security Protocol using Kryptonet key management ianaProtocolSKIP = 57 // SKIP ianaProtocolIPv6ICMP = 58 // ICMP for IPv6 ianaProtocolIPv6NoNxt = 59 // No Next Header for IPv6 ianaProtocolIPv6Opts = 60 // Destination Options for IPv6 ianaProtocolCFTP = 62 // CFTP ianaProtocolSATEXPAK = 64 // SATNET and Backroom EXPAK ianaProtocolKRYPTOLAN = 65 // Kryptolan ianaProtocolRVD = 66 // MIT Remote Virtual Disk Protocol ianaProtocolIPPC = 67 // Internet Pluribus Packet Core ianaProtocolSATMON = 69 // SATNET Monitoring ianaProtocolVISA = 70 // VISA Protocol ianaProtocolIPCV = 71 // Internet Packet Core Utility ianaProtocolCPNX = 72 // Computer Protocol Network Executive ianaProtocolCPHB = 73 // Computer Protocol Heart Beat ianaProtocolWSN = 74 // Wang Span Network ianaProtocolPVP = 75 // Packet Video Protocol ianaProtocolBRSATMON = 76 // Backroom SATNET Monitoring ianaProtocolSUNND = 77 // SUN ND PROTOCOL-Temporary ianaProtocolWBMON = 78 // WIDEBAND Monitoring ianaProtocolWBEXPAK = 79 // WIDEBAND EXPAK ianaProtocolISOIP = 80 // ISO Internet Protocol ianaProtocolVMTP = 81 // VMTP ianaProtocolSECUREVMTP = 82 // SECURE-VMTP ianaProtocolVINES = 83 // VINES ianaProtocolTTP = 84 // TTP ianaProtocolIPTM = 84 // Protocol Internet Protocol Traffic Manager ianaProtocolNSFNETIGP = 85 // NSFNET-IGP ianaProtocolDGP = 86 // Dissimilar Gateway Protocol ianaProtocolTCF = 87 // TCF ianaProtocolEIGRP = 88 // EIGRP ianaProtocolOSPFIGP = 89 // OSPFIGP ianaProtocolSpriteRPC = 90 // Sprite RPC Protocol ianaProtocolLARP = 91 // Locus Address Resolution Protocol ianaProtocolMTP = 92 // Multicast Transport Protocol ianaProtocolAX25 = 93 // AX.25 Frames ianaProtocolIPIP = 94 // IP-within-IP Encapsulation Protocol ianaProtocolMICP = 95 // Mobile Internetworking Control Pro. ianaProtocolSCCSP = 96 // Semaphore Communications Sec. Pro. ianaProtocolETHERIP = 97 // Ethernet-within-IP Encapsulation ianaProtocolENCAP = 98 // Encapsulation Header ianaProtocolGMTP = 100 // GMTP ianaProtocolIFMP = 101 // Ipsilon Flow Management Protocol ianaProtocolPNNI = 102 // PNNI over IP ianaProtocolPIM = 103 // Protocol Independent Multicast ianaProtocolARIS = 104 // ARIS ianaProtocolSCPS = 105 // SCPS ianaProtocolQNX = 106 // QNX ianaProtocolAN = 107 // Active Networks ianaProtocolIPComp = 108 // IP Payload Compression Protocol ianaProtocolSNP = 109 // Sitara Networks Protocol ianaProtocolCompaqPeer = 110 // Compaq Peer Protocol ianaProtocolIPXinIP = 111 // IPX in IP ianaProtocolVRRP = 112 // Virtual Router Redundancy Protocol ianaProtocolPGM = 113 // PGM Reliable Transport Protocol ianaProtocolL2TP = 115 // Layer Two Tunneling Protocol ianaProtocolDDX = 116 // D-II Data Exchange (DDX) ianaProtocolIATP = 117 // Interactive Agent Transfer Protocol ianaProtocolSTP = 118 // Schedule Transfer Protocol ianaProtocolSRP = 119 // SpectraLink Radio Protocol ianaProtocolUTI = 120 // UTI ianaProtocolSMP = 121 // Simple Message Protocol ianaProtocolSM = 122 // SM ianaProtocolPTP = 123 // Performance Transparency Protocol ianaProtocolISIS = 124 // ISIS over IPv4 ianaProtocolFIRE = 125 // FIRE ianaProtocolCRTP = 126 // Combat Radio Transport Protocol ianaProtocolCRUDP = 127 // Combat Radio User Datagram ianaProtocolSSCOPMCE = 128 // SSCOPMCE ianaProtocolIPLT = 129 // IPLT ianaProtocolSPS = 130 // Secure Packet Shield ianaProtocolPIPE = 131 // Private IP Encapsulation within IP ianaProtocolSCTP = 132 // Stream Control Transmission Protocol ianaProtocolFC = 133 // Fibre Channel ianaProtocolRSVPE2EIGNORE = 134 // RSVP-E2E-IGNORE ianaProtocolMobilityHeader = 135 // Mobility Header ianaProtocolUDPLite = 136 // UDPLite ianaProtocolMPLSinIP = 137 // MPLS-in-IP ianaProtocolMANET = 138 // MANET Protocols ianaProtocolHIP = 139 // Host Identity Protocol ianaProtocolShim6 = 140 // Shim6 Protocol ianaProtocolWESP = 141 // Wrapped Encapsulating Security Payload ianaProtocolROHC = 142 // Robust Header Compression ianaProtocolReserved = 255 // Reserved ) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/control.go������������������������������������������������������������������������������0000644�0001751�0001751�00000006130�12235217213�014215� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import ( "errors" "fmt" "net" "sync" ) var ( errNotSupported = errors.New("not supported") errMissingAddress = errors.New("missing address") errInvalidConnType = errors.New("invalid conn type") errNoSuchInterface = errors.New("no such interface") ) // References: // // RFC 2292 Advanced Sockets API for IPv6 // http://tools.ietf.org/html/rfc2292 // RFC 2460 Internet Protocol, Version 6 (IPv6) Specification // http://tools.ietf.org/html/rfc2460 // RFC 3493 Basic Socket Interface Extensions for IPv6 // http://tools.ietf.org/html/rfc3493.html // RFC 3542 Advanced Sockets Application Program Interface (API) for IPv6 // http://tools.ietf.org/html/rfc3542 // // Note that RFC 3542 obsoltes RFC 2292 but OS X Snow Leopard and the // 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. type rawOpt struct { sync.Mutex cflags ControlFlags } func (c *rawOpt) set(f ControlFlags) { c.cflags |= f } func (c *rawOpt) clear(f ControlFlags) { c.cflags &^= f } func (c *rawOpt) isset(f ControlFlags) bool { return c.cflags&f != 0 } // A ControlFlags reprensents per packet basis IP-level socket option // control flags. type ControlFlags uint const ( FlagTrafficClass ControlFlags = 1 << iota // pass the traffic class on the received packet FlagHopLimit // pass the hop limit on the received packet FlagSrc // pass the source address on the received packet FlagDst // pass the destination address on the received packet FlagInterface // pass the interface index on the received packet FlagPathMTU // pass the path MTU on the received packet path ) // A ControlMessage represents per packet basis IP-level socket // options. type ControlMessage struct { // Receiving socket options: SetControlMessage allows to // receive the options from the protocol stack using ReadFrom // method of PacketConn. // // Specifying socket options: ControlMessage for WriteTo // method of PacketConn allows to send the options to the // protocol stack. // TrafficClass int // traffic class, must be 1 <= value <= 255 when specifying HopLimit int // hop limit, must be 1 <= value <= 255 when specifying Src net.IP // source address, specifying only Dst net.IP // destination address, receiving only IfIndex int // interface index, must be 1 <= value when specifying NextHop net.IP // next hop address, specifying only MTU int // path MTU, receiving only } func (cm *ControlMessage) String() string { if cm == nil { return "<nil>" } return fmt.Sprintf("tclass: %#x, hoplim: %v, src: %v, dst: %v, ifindex: %v, nexthop: %v, mtu: %v", cm.TrafficClass, cm.HopLimit, cm.Src, cm.Dst, cm.IfIndex, cm.NextHop, cm.MTU) } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/multicast_test.go�����������������������������������������������������������������������0000644�0001751�0001751�00000013441�12235217213�015604� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6_test import ( "code.google.com/p/go.net/ipv6" "net" "os" "runtime" "testing" "time" ) func TestPacketConnReadWriteMulticastUDP(t *testing.T) { switch runtime.GOOS { case "freebsd": // due to a bug on loopback marking // See http://www.freebsd.org/cgi/query-pr.cgi?pr=180065. t.Skipf("not supported on %q", runtime.GOOS) case "plan9", "windows": t.Skipf("not supported on %q", runtime.GOOS) } if !supportsIPv6 { t.Skip("ipv6 is not supported") } ifi := loopbackInterface() if ifi == nil { t.Skipf("not available on %q", runtime.GOOS) } c, err := net.ListenPacket("udp6", "[ff02::114]:0") // see RFC 4727 if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() _, port, err := net.SplitHostPort(c.LocalAddr().String()) if err != nil { t.Fatalf("net.SplitHostPort failed: %v", err) } dst, err := net.ResolveUDPAddr("udp6", "[ff02::114]:"+port) // see RFC 4727 if err != nil { t.Fatalf("net.ResolveUDPAddr failed: %v", err) } p := ipv6.NewPacketConn(c) defer p.Close() if err := p.JoinGroup(ifi, dst); err != nil { t.Fatalf("ipv6.PacketConn.JoinGroup on %v failed: %v", ifi, err) } if err := p.SetMulticastInterface(ifi); err != nil { t.Fatalf("ipv6.PacketConn.SetMulticastInterface failed: %v", err) } if _, err := p.MulticastInterface(); err != nil { t.Fatalf("ipv6.PacketConn.MulticastInterface failed: %v", err) } if err := p.SetMulticastLoopback(true); err != nil { t.Fatalf("ipv6.PacketConn.SetMulticastLoopback failed: %v", err) } if _, err := p.MulticastLoopback(); err != nil { t.Fatalf("ipv6.PacketConn.MulticastLoopback failed: %v", err) } cm := ipv6.ControlMessage{ TrafficClass: DiffServAF11 | CongestionExperienced, IfIndex: ifi.Index, } cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagInterface | ipv6.FlagPathMTU for i, toggle := range []bool{true, false, true} { if err := p.SetControlMessage(cf, toggle); err != nil { t.Fatalf("ipv6.PacketConn.SetControlMessage failed: %v", err) } if err := p.SetDeadline(time.Now().Add(time.Millisecond * 200)); err != nil { t.Fatalf("ipv6.PacketConn.SetDeadline failed: %v", err) } cm.HopLimit = i + 1 if _, err := p.WriteTo([]byte("HELLO-R-U-THERE"), &cm, dst); err != nil { t.Fatalf("ipv6.PacketConn.WriteTo failed: %v", err) } b := make([]byte, 128) if _, cm, _, err := p.ReadFrom(b); err != nil { t.Fatalf("ipv6.PacketConn.ReadFrom failed: %v", err) } else { t.Logf("rcvd cmsg: %v", cm) } } } func TestPacketConnReadWriteMulticastICMP(t *testing.T) { switch runtime.GOOS { case "plan9", "windows": t.Skipf("not supported on %q", runtime.GOOS) } if !supportsIPv6 { t.Skip("ipv6 is not supported") } if os.Getuid() != 0 { t.Skip("must be root") } ifi := loopbackInterface() if ifi == nil { t.Skipf("not available on %q", runtime.GOOS) } c, err := net.ListenPacket("ip6:ipv6-icmp", "::") if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() dst, err := net.ResolveIPAddr("ip6", "ff02::114") // see RFC 4727 if err != nil { t.Fatalf("net.ResolveIPAddr failed: %v", err) } pshicmp := ipv6PseudoHeader(c.LocalAddr().(*net.IPAddr).IP, dst.IP, ianaProtocolIPv6ICMP) p := ipv6.NewPacketConn(c) defer p.Close() if err := p.JoinGroup(ifi, dst); err != nil { t.Fatalf("ipv6.PacketConn.JoinGroup on %v failed: %v", ifi, err) } if err := p.SetMulticastInterface(ifi); err != nil { t.Fatalf("ipv6.PacketConn.SetMulticastInterface failed: %v", err) } if _, err := p.MulticastInterface(); err != nil { t.Fatalf("ipv6.PacketConn.MulticastInterface failed: %v", err) } if err := p.SetMulticastLoopback(true); err != nil { t.Fatalf("ipv6.PacketConn.SetMulticastLoopback failed: %v", err) } if _, err := p.MulticastLoopback(); err != nil { t.Fatalf("ipv6.PacketConn.MulticastLoopback failed: %v", err) } cm := ipv6.ControlMessage{ TrafficClass: DiffServAF11 | CongestionExperienced, IfIndex: ifi.Index, } cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagInterface | ipv6.FlagPathMTU var f ipv6.ICMPFilter f.SetAll(true) f.Set(ipv6.ICMPTypeEchoReply, false) if err := p.SetICMPFilter(&f); err != nil { t.Fatalf("ipv6.PacketConn.SetICMPFilter failed: %v", err) } var psh []byte for i, toggle := range []bool{true, false, true} { if toggle { psh = nil if err := p.SetChecksum(true, 2); err != nil { t.Fatalf("ipv6.PacketConn.SetChecksum failed: %v", err) } } else { psh = pshicmp // Some platforms never allow to disable the // kernel checksum processing. p.SetChecksum(false, -1) } wb, err := (&icmpMessage{ Type: ipv6.ICMPTypeEchoRequest, Code: 0, Body: &icmpEcho{ ID: os.Getpid() & 0xffff, Seq: i + 1, Data: []byte("HELLO-R-U-THERE"), }, }).Marshal(psh) if err != nil { t.Fatalf("icmpMessage.Marshal failed: %v", err) } if err := p.SetControlMessage(cf, toggle); err != nil { t.Fatalf("ipv6.PacketConn.SetControlMessage failed: %v", err) } if err := p.SetDeadline(time.Now().Add(time.Millisecond * 200)); err != nil { t.Fatalf("ipv6.PacketConn.SetDeadline failed: %v", err) } cm.HopLimit = i + 1 if _, err := p.WriteTo(wb, &cm, dst); err != nil { t.Fatalf("ipv6.PacketConn.WriteTo failed: %v", err) } b := make([]byte, 128) if n, cm, _, err := p.ReadFrom(b); err != nil { t.Fatalf("ipv6.PacketConn.ReadFrom failed: %v", err) } else { t.Logf("rcvd cmsg: %v", cm) if m, err := parseICMPMessage(b[:n]); err != nil { t.Fatalf("parseICMPMessage failed: %v", err) } else if m.Type != ipv6.ICMPTypeEchoReply || m.Code != 0 { t.Fatalf("got type=%v, code=%v; expected type=%v, code=%v", m.Type, m.Code, ipv6.ICMPTypeEchoReply, 0) } } } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/dgramopt_plan9.go�����������������������������������������������������������������������0000644�0001751�0001751�00000006043�12235217213�015460� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import ( "net" "syscall" ) // MulticastHopLimit returns the hop limit field value for outgoing // multicast packets. func (c *dgramOpt) MulticastHopLimit() (int, error) { // TODO(mikio): Implement this return 0, syscall.EPLAN9 } // SetMulticastHopLimit sets the hop limit field value for future // outgoing multicast packets. func (c *dgramOpt) SetMulticastHopLimit(hoplim int) error { // TODO(mikio): Implement this return syscall.EPLAN9 } // MulticastInterface returns the default interface for multicast // packet transmissions. func (c *dgramOpt) MulticastInterface() (*net.Interface, error) { // TODO(mikio): Implement this return nil, syscall.EPLAN9 } // SetMulticastInterface sets the default interface for future // multicast packet transmissions. func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error { // TODO(mikio): Implement this return syscall.EPLAN9 } // MulticastLoopback reports whether transmitted multicast packets // should be copied and send back to the originator. func (c *dgramOpt) MulticastLoopback() (bool, error) { // TODO(mikio): Implement this return false, syscall.EPLAN9 } // SetMulticastLoopback sets whether transmitted multicast packets // should be copied and send back to the originator. func (c *dgramOpt) SetMulticastLoopback(on bool) error { // TODO(mikio): Implement this return syscall.EPLAN9 } // JoinGroup joins the group address group on the interface ifi. // It uses the system assigned multicast interface when ifi is nil, // although this is not recommended because the assignment depends on // platforms and sometimes it might require routing configuration. func (c *dgramOpt) JoinGroup(ifi *net.Interface, group net.Addr) error { // TODO(mikio): Implement this return syscall.EPLAN9 } // LeaveGroup leaves the group address group on the interface ifi. func (c *dgramOpt) LeaveGroup(ifi *net.Interface, group net.Addr) error { // TODO(mikio): Implement this return syscall.EPLAN9 } // Checksum reports whether the kernel will compute, store or verify a // 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) { // TODO(mikio): Implement this return false, 0, syscall.EPLAN9 } // 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 { // TODO(mikio): Implement this return syscall.EPLAN9 } // ICMPFilter returns an ICMP filter. func (c *dgramOpt) ICMPFilter() (*ICMPFilter, error) { // TODO(mikio): Implement this return nil, syscall.EPLAN9 } // SetICMPFilter deploys the ICMP filter. func (c *dgramOpt) SetICMPFilter(f *ICMPFilter) error { // TODO(mikio): Implement this return syscall.EPLAN9 } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/control_rfc2292_darwin.go���������������������������������������������������������������0000644�0001751�0001751�00000007462�12235217213�016743� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import ( "net" "os" "syscall" "unsafe" ) const pktinfo = FlagDst | FlagInterface func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error { opt.Lock() defer opt.Unlock() if cf&FlagHopLimit != 0 { if err := setIPv6ReceiveHopLimit(fd, on); err != nil { return err } if on { opt.set(FlagHopLimit) } else { opt.clear(FlagHopLimit) } } if cf&pktinfo != 0 { if err := setIPv6ReceivePacketInfo(fd, on); err != nil { return err } if on { opt.set(cf & pktinfo) } else { opt.clear(cf & pktinfo) } } return nil } func newControlMessage(opt *rawOpt) (oob []byte) { opt.Lock() defer opt.Unlock() l, off := 0, 0 if opt.isset(FlagHopLimit) { l += syscall.CmsgSpace(4) } if opt.isset(pktinfo) { l += syscall.CmsgSpace(syscall.SizeofInet6Pktinfo) } if l > 0 { oob = make([]byte, l) if opt.isset(FlagHopLimit) { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_2292HOPLIMIT m.SetLen(syscall.CmsgLen(4)) off += syscall.CmsgSpace(4) } if opt.isset(pktinfo) { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_2292PKTINFO m.SetLen(syscall.CmsgLen(syscall.SizeofInet6Pktinfo)) off += syscall.CmsgSpace(syscall.SizeofInet6Pktinfo) } } return } func parseControlMessage(b []byte) (*ControlMessage, error) { if len(b) == 0 { return nil, nil } cmsgs, err := syscall.ParseSocketControlMessage(b) if err != nil { return nil, os.NewSyscallError("parse socket control message", err) } cm := &ControlMessage{} for _, m := range cmsgs { if m.Header.Level != ianaProtocolIPv6 { continue } switch m.Header.Type { case syscall.IPV6_2292HOPLIMIT: cm.HopLimit = int(*(*byte)(unsafe.Pointer(&m.Data[:1][0]))) case syscall.IPV6_2292PKTINFO: pi := (*syscall.Inet6Pktinfo)(unsafe.Pointer(&m.Data[0])) cm.IfIndex = int(pi.Ifindex) cm.Dst = pi.Addr[:] } } return cm, nil } func marshalControlMessage(cm *ControlMessage) (oob []byte) { if cm == nil { return } l, off := 0, 0 if cm.HopLimit > 0 { l += syscall.CmsgSpace(4) } pion := false if cm.Src.To4() == nil && cm.Src.To16() != nil || cm.IfIndex != 0 { pion = true l += syscall.CmsgSpace(syscall.SizeofInet6Pktinfo) } if len(cm.NextHop) == net.IPv6len { l += syscall.CmsgSpace(syscall.SizeofSockaddrInet6) } if l > 0 { oob = make([]byte, l) if cm.HopLimit > 0 { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_2292HOPLIMIT m.SetLen(syscall.CmsgLen(4)) data := oob[off+syscall.CmsgLen(0):] *(*byte)(unsafe.Pointer(&data[:1][0])) = byte(cm.HopLimit) off += syscall.CmsgSpace(4) } if pion { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_2292PKTINFO m.SetLen(syscall.CmsgLen(syscall.SizeofInet6Pktinfo)) pi := (*syscall.Inet6Pktinfo)(unsafe.Pointer(&oob[off+syscall.CmsgLen(0)])) if ip := cm.Src.To16(); ip != nil && ip.To4() == nil { copy(pi.Addr[:], ip) } if cm.IfIndex != 0 { pi.Ifindex = uint32(cm.IfIndex) } off += syscall.CmsgSpace(syscall.SizeofInet6Pktinfo) } if len(cm.NextHop) == net.IPv6len { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_2292NEXTHOP m.SetLen(syscall.CmsgLen(syscall.SizeofSockaddrInet6)) sa := (*syscall.RawSockaddrInet6)(unsafe.Pointer(&oob[off+syscall.CmsgLen(0)])) sa.Len = syscall.SizeofSockaddrInet6 sa.Family = syscall.AF_INET6 copy(sa.Addr[:], cm.NextHop) off += syscall.CmsgSpace(syscall.SizeofSockaddrInet6) } } return } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/multicastsockopt_test.go����������������������������������������������������������������0000644�0001751�0001751�00000004263�12235217213�017211� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6_test import ( "code.google.com/p/go.net/ipv6" "net" "os" "runtime" "testing" ) var packetConnMulticastSocketOptionTests = []struct { net, proto, addr string gaddr net.Addr }{ {"udp6", "", "[ff02::]:0", &net.UDPAddr{IP: net.ParseIP("ff02::114")}}, // see RFC 4727 {"ip6", ":ipv6-icmp", "::", &net.IPAddr{IP: net.ParseIP("ff02::114")}}, // see RFC 4727 } func TestPacketConnMulticastSocketOptions(t *testing.T) { switch runtime.GOOS { case "plan9", "windows": t.Skipf("not supported on %q", runtime.GOOS) } if !supportsIPv6 { t.Skip("ipv6 is not supported") } ifi := loopbackInterface() if ifi == nil { t.Skipf("not available on %q", runtime.GOOS) } for _, tt := range packetConnMulticastSocketOptionTests { if tt.net == "ip6" && os.Getuid() != 0 { t.Skip("must be root") } c, err := net.ListenPacket(tt.net+tt.proto, tt.addr) if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() p := ipv6.NewPacketConn(c) hoplim := 255 if err := p.SetMulticastHopLimit(hoplim); err != nil { t.Fatalf("ipv6.PacketConn.SetMulticastHopLimit failed: %v", err) } if v, err := p.MulticastHopLimit(); err != nil { t.Fatalf("ipv6.PacketConn.MulticastHopLimit failed: %v", err) } else if v != hoplim { t.Fatalf("got unexpected multicast hop limit %v; expected %v", v, hoplim) } for _, toggle := range []bool{true, false} { if err := p.SetMulticastLoopback(toggle); err != nil { t.Fatalf("ipv6.PacketConn.SetMulticastLoopback failed: %v", err) } if v, err := p.MulticastLoopback(); err != nil { t.Fatalf("ipv6.PacketConn.MulticastLoopback failed: %v", err) } else if v != toggle { t.Fatalf("got unexpected multicast loopback %v; expected %v", v, toggle) } } if err := p.JoinGroup(ifi, tt.gaddr); err != nil { t.Fatalf("ipv6.PacketConn.JoinGroup(%v, %v) failed: %v", ifi, tt.gaddr, err) } if err := p.LeaveGroup(ifi, tt.gaddr); err != nil { t.Fatalf("ipv6.PacketConn.LeaveGroup(%v, %v) failed: %v", ifi, tt.gaddr, err) } } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/mocktransponder_test.go�����������������������������������������������������������������0000644�0001751�0001751�00000004246�12235217213�017013� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6_test import ( "net" "testing" ) func isLinkLocalUnicast(ip net.IP) bool { return ip.To4() == nil && ip.To16() != nil && ip.IsLinkLocalUnicast() } func loopbackInterface() *net.Interface { ift, err := net.Interfaces() if err != nil { return nil } for _, ifi := range ift { if ifi.Flags&net.FlagLoopback == 0 || ifi.Flags&net.FlagUp == 0 { continue } ifat, err := ifi.Addrs() if err != nil { continue } for _, ifa := range ifat { switch ifa := ifa.(type) { case *net.IPAddr: if isLinkLocalUnicast(ifa.IP) { return &ifi } case *net.IPNet: if isLinkLocalUnicast(ifa.IP) { return &ifi } } } } return nil } func isMulticastAvailable(ifi *net.Interface) (net.IP, bool) { if ifi == nil || ifi.Flags&net.FlagUp == 0 || ifi.Flags&net.FlagMulticast == 0 { return nil, false } ifat, err := ifi.Addrs() if err != nil { return nil, false } for _, ifa := range ifat { switch ifa := ifa.(type) { case *net.IPAddr: if isLinkLocalUnicast(ifa.IP) { return ifa.IP, true } case *net.IPNet: if isLinkLocalUnicast(ifa.IP) { return ifa.IP, true } } } return nil, false } func connector(t *testing.T, network, addr string, done chan<- bool) { defer func() { done <- true }() c, err := net.Dial(network, addr) if err != nil { t.Errorf("net.Dial failed: %v", err) return } c.Close() } func acceptor(t *testing.T, ln net.Listener, done chan<- bool) { defer func() { done <- true }() c, err := ln.Accept() if err != nil { t.Errorf("net.Listener.Accept failed: %v", err) return } c.Close() } func transponder(t *testing.T, ln net.Listener, done chan<- bool) { defer func() { done <- true }() c, err := ln.Accept() if err != nil { t.Errorf("net.Listener.Accept failed: %v", err) return } defer c.Close() b := make([]byte, 128) n, err := c.Read(b) if err != nil { t.Errorf("net.Conn.Read failed: %v", err) return } if _, err := c.Write(b[:n]); err != nil { t.Errorf("net.Conn.Write failed: %v", err) return } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/sockopt_rfc3542_windows.go��������������������������������������������������������������0000644�0001751�0001751�00000003040�12235217213�017136� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import "syscall" func ipv6ReceiveTrafficClass(fd syscall.Handle) (bool, error) { // TODO(mikio): Implement this return false, syscall.EWINDOWS } func setIPv6ReceiveTrafficClass(fd syscall.Handle, v bool) error { // TODO(mikio): Implement this return syscall.EWINDOWS } func ipv6ReceiveHopLimit(fd syscall.Handle) (bool, error) { // TODO(mikio): Implement this return false, syscall.EWINDOWS } func setIPv6ReceiveHopLimit(fd syscall.Handle, v bool) error { // TODO(mikio): Implement this return syscall.EWINDOWS } func ipv6ReceivePacketInfo(fd syscall.Handle) (bool, error) { // TODO(mikio): Implement this return false, syscall.EWINDOWS } func setIPv6ReceivePacketInfo(fd syscall.Handle, v bool) error { // TODO(mikio): Implement this return syscall.EWINDOWS } func ipv6PathMTU(fd syscall.Handle) (int, error) { // TODO(mikio): Implement this return 0, syscall.EWINDOWS } func ipv6ReceivePathMTU(fd syscall.Handle) (bool, error) { // TODO(mikio): Implement this return false, syscall.EWINDOWS } func setIPv6ReceivePathMTU(fd syscall.Handle, v bool) error { // TODO(mikio): Implement this return syscall.EWINDOWS } func ipv6ICMPFilter(fd syscall.Handle) (*ICMPFilter, error) { // TODO(mikio): Implement this return nil, syscall.EWINDOWS } func setIPv6ICMPFilter(fd syscall.Handle, f *ICMPFilter) error { // TODO(mikio): Implement this return syscall.EWINDOWS } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/gen.go����������������������������������������������������������������������������������0000644�0001751�0001751�00000012512�12235217213�013307� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build ignore // This program generates internet protocol constatns and tables by // reading IANA protocol registries. // // Usage: // go run gen.go > iana.go package main import ( "bytes" "encoding/xml" "fmt" "go/format" "io" "net/http" "os" "strconv" "strings" ) var registries = []struct { url string parse func(io.Writer, io.Reader) error }{ { "http://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xml", parseICMPv6Parameters, }, { "http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml", parseProtocolNumbers, }, } func main() { var bb bytes.Buffer fmt.Fprintf(&bb, "// go run gen.go\n") fmt.Fprintf(&bb, "// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n") fmt.Fprintf(&bb, "package ipv6\n\n") for _, r := range registries { resp, err := http.Get(r.url) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { fmt.Fprintf(os.Stderr, "got HTTP status code %v for %v\n", resp.StatusCode, r.url) os.Exit(1) } if err := r.parse(&bb, resp.Body); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } fmt.Fprintf(&bb, "\n") } b, err := format.Source(bb.Bytes()) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } os.Stdout.Write(b) } func parseICMPv6Parameters(w io.Writer, r io.Reader) error { dec := xml.NewDecoder(r) var icp icmpv6Parameters if err := dec.Decode(&icp); err != nil { return err } prs := icp.escape() fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) fmt.Fprintf(w, "const (\n") for _, pr := range prs { if pr.Name == "" { continue } fmt.Fprintf(w, "ICMPType%s ICMPType = %d", pr.Name, pr.Value) fmt.Fprintf(w, "// %s\n", pr.OrigName) } fmt.Fprintf(w, ")\n\n") fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) fmt.Fprintf(w, "var icmpTypes = map[ICMPType]string{\n") for _, pr := range prs { if pr.Name == "" { continue } fmt.Fprintf(w, "%d: %q,\n", pr.Value, strings.ToLower(pr.OrigName)) } fmt.Fprintf(w, "}\n") return nil } type icmpv6Parameters struct { XMLName xml.Name `xml:"registry"` Title string `xml:"title"` Updated string `xml:"updated"` Registries []struct { Title string `xml:"title"` Records []struct { Value string `xml:"value"` Name string `xml:"name"` } `xml:"record"` } `xml:"registry"` } type canonICMPv6ParamRecord struct { OrigName string Name string Value int } func (icp *icmpv6Parameters) escape() []canonICMPv6ParamRecord { id := -1 for i, r := range icp.Registries { if strings.Contains(r.Title, "Type") || strings.Contains(r.Title, "type") { id = i break } } if id < 0 { return nil } prs := make([]canonICMPv6ParamRecord, len(icp.Registries[id].Records)) sr := strings.NewReplacer( "Messages", "", "Message", "", "ICMP", "", "+", "P", "-", "", "/", "", ".", "", " ", "", ) for i, pr := range icp.Registries[id].Records { if strings.Contains(pr.Name, "Reserved") || strings.Contains(pr.Name, "Unassigned") || strings.Contains(pr.Name, "Deprecated") || strings.Contains(pr.Name, "Experiment") || strings.Contains(pr.Name, "experiment") { continue } ss := strings.Split(pr.Name, "\n") if len(ss) > 1 { prs[i].Name = strings.Join(ss, " ") } else { prs[i].Name = ss[0] } s := strings.TrimSpace(prs[i].Name) prs[i].OrigName = s prs[i].Name = sr.Replace(s) prs[i].Value, _ = strconv.Atoi(pr.Value) } return prs } func parseProtocolNumbers(w io.Writer, r io.Reader) error { dec := xml.NewDecoder(r) var pn protocolNumbers if err := dec.Decode(&pn); err != nil { return err } prs := pn.escape() fmt.Fprintf(w, "// %s, Updated: %s\n", pn.Title, pn.Updated) fmt.Fprintf(w, "const (\n") for _, pr := range prs { if pr.Name == "" { continue } fmt.Fprintf(w, "ianaProtocol%s = %d", pr.Name, pr.Value) s := pr.Descr if s == "" { s = pr.OrigName } fmt.Fprintf(w, "// %s\n", s) } fmt.Fprintf(w, ")\n") return nil } type protocolNumbers struct { XMLName xml.Name `xml:"registry"` Title string `xml:"title"` Updated string `xml:"updated"` RegTitle string `xml:"registry>title"` Note string `xml:"registry>note"` Records []struct { Value string `xml:"value"` Name string `xml:"name"` Descr string `xml:"description"` } `xml:"registry>record"` } type canonProtocolRecord struct { OrigName string Name string Descr string Value int } func (pn *protocolNumbers) escape() []canonProtocolRecord { prs := make([]canonProtocolRecord, len(pn.Records)) sr := strings.NewReplacer( "-in-", "in", "-within-", "within", "-over-", "over", "+", "P", "-", "", "/", "", ".", "", " ", "", ) for i, pr := range pn.Records { prs[i].OrigName = pr.Name s := strings.TrimSpace(pr.Name) switch pr.Name { case "ISIS over IPv4": prs[i].Name = "ISIS" case "manet": prs[i].Name = "MANET" default: prs[i].Name = sr.Replace(s) } ss := strings.Split(pr.Descr, "\n") for i := range ss { ss[i] = strings.TrimSpace(ss[i]) } if len(ss) > 1 { prs[i].Descr = strings.Join(ss, " ") } else { prs[i].Descr = ss[0] } prs[i].Value, _ = strconv.Atoi(pr.Value) } return prs } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/endpoint.go�����������������������������������������������������������������������������0000644�0001751�0001751�00000005557�12235217213�014371� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import ( "net" "syscall" "time" ) // A Conn represents a network endpoint that uses IPv6 transport. // It allows to set basic IP-level socket options such as traffic // class and hop limit. type Conn struct { genericOpt } type genericOpt struct { net.Conn } func (c *genericOpt) ok() bool { return c != nil && c.Conn != nil } // PathMTU returns a path MTU value for the destination associated // with the endpoint. func (c *Conn) PathMTU() (int, error) { if !c.genericOpt.ok() { return 0, syscall.EINVAL } fd, err := c.genericOpt.sysfd() if err != nil { return 0, err } return ipv6PathMTU(fd) } // NewConn returns a new Conn. func NewConn(c net.Conn) *Conn { return &Conn{ genericOpt: genericOpt{Conn: c}, } } // 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 // based network I/O methods specific to the IPv6 and higher layer // protocols such as OSPF, GRE, and UDP. type PacketConn struct { genericOpt dgramOpt payloadHandler } type dgramOpt struct { net.PacketConn } func (c *dgramOpt) ok() bool { return c != nil && c.PacketConn != nil } // SetControlMessage allows to receive the per packet basis IP-level // socket options. func (c *PacketConn) SetControlMessage(cf ControlFlags, on bool) error { if !c.payloadHandler.ok() { return syscall.EINVAL } fd, err := c.payloadHandler.sysfd() if err != nil { return err } return setControlMessage(fd, &c.payloadHandler.rawOpt, cf, on) } // SetDeadline sets the read and write deadlines associated with the // endpoint. func (c *PacketConn) SetDeadline(t time.Time) error { if !c.payloadHandler.ok() { return syscall.EINVAL } return c.payloadHandler.SetDeadline(t) } // SetReadDeadline sets the read deadline associated with the // endpoint. func (c *PacketConn) SetReadDeadline(t time.Time) error { if !c.payloadHandler.ok() { return syscall.EINVAL } return c.payloadHandler.SetReadDeadline(t) } // SetWriteDeadline sets the write deadline associated with the // endpoint. func (c *PacketConn) SetWriteDeadline(t time.Time) error { if !c.payloadHandler.ok() { return syscall.EINVAL } return c.payloadHandler.SetWriteDeadline(t) } // Close closes the endpoint. func (c *PacketConn) Close() error { if !c.payloadHandler.ok() { return syscall.EINVAL } return c.payloadHandler.Close() } // NewPacketConn returns a new PacketConn using c as its underlying // transport. func NewPacketConn(c net.PacketConn) *PacketConn { return &PacketConn{ genericOpt: genericOpt{Conn: c.(net.Conn)}, dgramOpt: dgramOpt{PacketConn: c}, payloadHandler: payloadHandler{PacketConn: c}, } } �������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/helper_windows.go�����������������������������������������������������������������������0000644�0001751�0001751�00000002127�12235217213�015570� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import ( "net" "reflect" "syscall" ) func (c *genericOpt) sysfd() (syscall.Handle, error) { switch p := c.Conn.(type) { case *net.TCPConn, *net.UDPConn, *net.IPConn: return sysfd(p) } return syscall.InvalidHandle, errInvalidConnType } func (c *dgramOpt) sysfd() (syscall.Handle, error) { switch p := c.PacketConn.(type) { case *net.UDPConn, *net.IPConn: return sysfd(p.(net.Conn)) } return syscall.InvalidHandle, errInvalidConnType } func (c *payloadHandler) sysfd() (syscall.Handle, error) { return sysfd(c.PacketConn.(net.Conn)) } func sysfd(c net.Conn) (syscall.Handle, error) { cv := reflect.ValueOf(c) switch ce := cv.Elem(); ce.Kind() { case reflect.Struct: netfd := ce.FieldByName("conn").FieldByName("fd") switch fe := netfd.Elem(); fe.Kind() { case reflect.Struct: fd := fe.FieldByName("sysfd") return syscall.Handle(fd.Uint()), nil } } return syscall.InvalidHandle, errInvalidConnType } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/control_test.go�������������������������������������������������������������������������0000644�0001751�0001751�00000001655�12235217213�015263� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import ( "sync" "testing" ) func TestControlFlags(t *testing.T) { tf := FlagInterface | FlagPathMTU opt := rawOpt{cflags: tf | FlagHopLimit} // This loop runs methods of raw.Opt concurrently for testing // concurrent access to the rawOpt. The first entry shold be // opt.set and the last entry should be opt.clear. tfns := []func(ControlFlags){opt.set, opt.clear, opt.clear} ch := make(chan bool) var wg sync.WaitGroup for i, fn := range tfns { wg.Add(1) go func(i int, fn func(ControlFlags)) { defer wg.Done() switch i { case 0: close(ch) case len(tfns) - 1: <-ch } opt.Lock() defer opt.Unlock() fn(tf) }(i, fn) } wg.Wait() if opt.isset(tf) { t.Fatalf("got %#x; expected %#x", opt.cflags, FlagHopLimit) } } �����������������������������������������������������������������������������������go.net/ipv6/icmp_bsd.go�����������������������������������������������������������������������������0000644�0001751�0001751�00000001311�12235217213�014311� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin freebsd netbsd openbsd package ipv6 import "syscall" type rawICMPFilter struct { syscall.ICMPv6Filter } func (f *rawICMPFilter) set(typ ICMPType, block bool) { if block { f.Filt[typ>>5] &^= 1 << (uint32(typ) & 31) } else { f.Filt[typ>>5] |= 1 << (uint32(typ) & 31) } } func (f *rawICMPFilter) setAll(block bool) { for i := range f.Filt { if block { f.Filt[i] = 0 } else { f.Filt[i] = 1<<32 - 1 } } } func (f *rawICMPFilter) willBlock(typ ICMPType) bool { return f.Filt[typ>>5]&(1<<(uint32(typ)&31)) == 0 } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/icmp.go���������������������������������������������������������������������������������0000644�0001751�0001751�00000001734�12235217213�013472� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import "sync" // An ICMPType represents a type of ICMP message. type ICMPType int func (typ ICMPType) String() string { s, ok := icmpTypes[typ] if !ok { return "<nil>" } return s } // An ICMPFilter represents an ICMP message filter for incoming // packets. type ICMPFilter struct { mu sync.RWMutex rawICMPFilter } // Set sets the ICMP type and filter action to the filter. func (f *ICMPFilter) Set(typ ICMPType, block bool) { f.mu.Lock() defer f.mu.Unlock() f.set(typ, block) } // SetAll sets the filter action to the filter. func (f *ICMPFilter) SetAll(block bool) { f.mu.Lock() defer f.mu.Unlock() f.setAll(block) } // WillBlock reports whether the ICMP type will be blocked. func (f *ICMPFilter) WillBlock(typ ICMPType) bool { f.mu.RLock() defer f.mu.RUnlock() return f.willBlock(typ) } ������������������������������������go.net/ipv6/iana_test.go����������������������������������������������������������������������������0000644�0001751�0001751�00000002377�12235217213�014515� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// go run gentest.go // GENERATED BY THE COMMAND ABOVE; DO NOT EDIT package ipv6_test // Differentiated Services Field Codepoints (DSCP), Updated: 2013-06-25 const ( DiffServCS0 = 0x0 // CS0 DiffServCS1 = 0x20 // CS1 DiffServCS2 = 0x40 // CS2 DiffServCS3 = 0x60 // CS3 DiffServCS4 = 0x80 // CS4 DiffServCS5 = 0xa0 // CS5 DiffServCS6 = 0xc0 // CS6 DiffServCS7 = 0xe0 // CS7 DiffServAF11 = 0x28 // AF11 DiffServAF12 = 0x30 // AF12 DiffServAF13 = 0x38 // AF13 DiffServAF21 = 0x48 // AF21 DiffServAF22 = 0x50 // AF22 DiffServAF23 = 0x58 // AF23 DiffServAF31 = 0x68 // AF31 DiffServAF32 = 0x70 // AF32 DiffServAF33 = 0x78 // AF33 DiffServAF41 = 0x88 // AF41 DiffServAF42 = 0x90 // AF42 DiffServAF43 = 0x98 // AF43 DiffServEFPHB = 0xb8 // EF PHB DiffServVOICEADMIT = 0xb0 // VOICE-ADMIT ) // IPv4 TOS Byte and IPv6 Traffic Class Octet, Updated: 2001-09-06 const ( NotECNTransport = 0x0 // Not-ECT (Not ECN-Capable Transport) ECNTransport1 = 0x1 // ECT(1) (ECN-Capable Transport(1)) ECNTransport0 = 0x2 // ECT(0) (ECN-Capable Transport(0)) CongestionExperienced = 0x3 // CE (Congestion Experienced) ) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/sockopt_rfc3542_unix.go�����������������������������������������������������������������0000644�0001751�0001751�00000002701�12235217213�016432� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build freebsd linux netbsd openbsd package ipv6 import ( "os" "syscall" ) func ipv6ReceiveTrafficClass(fd int) (bool, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_RECVTCLASS) if err != nil { return false, os.NewSyscallError("getsockopt", err) } return v == 1, nil } func setIPv6ReceiveTrafficClass(fd int, v bool) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_RECVTCLASS, boolint(v))) } func ipv6ReceiveHopLimit(fd int) (bool, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_RECVHOPLIMIT) if err != nil { return false, os.NewSyscallError("getsockopt", err) } return v == 1, nil } func setIPv6ReceiveHopLimit(fd int, v bool) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_RECVHOPLIMIT, boolint(v))) } func ipv6ReceivePacketInfo(fd int) (bool, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_RECVPKTINFO) if err != nil { return false, os.NewSyscallError("getsockopt", err) } return v == 1, nil } func setIPv6ReceivePacketInfo(fd int, v bool) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_RECVPKTINFO, boolint(v))) } ���������������������������������������������������������������go.net/ipv6/payload_cmsg.go�������������������������������������������������������������������������0000644�0001751�0001751�00000003707�12235217213�015206� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !plan9,!windows package ipv6 import ( "net" "syscall" ) // ReadFrom reads a payload of the received IPv6 datagram, from the // 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) { if !c.ok() { return 0, nil, nil, syscall.EINVAL } oob := newControlMessage(&c.rawOpt) var oobn int switch c := c.PacketConn.(type) { case *net.UDPConn: if n, oobn, _, src, err = c.ReadMsgUDP(b, oob); err != nil { return 0, nil, nil, err } case *net.IPConn: if n, oobn, _, src, err = c.ReadMsgIP(b, oob); err != nil { return 0, nil, nil, err } default: return 0, nil, nil, errInvalidConnType } if cm, err = parseControlMessage(oob[:oobn]); err != nil { return 0, nil, nil, err } if cm != nil { cm.Src = netAddrToIP16(src) } return } // 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 // 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() { return 0, syscall.EINVAL } oob := marshalControlMessage(cm) if dst == nil { return 0, errMissingAddress } switch c := c.PacketConn.(type) { case *net.UDPConn: n, _, err = c.WriteMsgUDP(b, oob, dst.(*net.UDPAddr)) case *net.IPConn: n, _, err = c.WriteMsgIP(b, oob, dst.(*net.IPAddr)) default: return 0, errInvalidConnType } if err != nil { return 0, err } return } ���������������������������������������������������������go.net/ipv6/icmp_test.go����������������������������������������������������������������������������0000644�0001751�0001751�00000003540�12235217213�014526� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6_test import ( "code.google.com/p/go.net/ipv6" "net" "os" "reflect" "runtime" "sync" "testing" ) func TestICMPFilter(t *testing.T) { switch runtime.GOOS { case "plan9", "windows": t.Skipf("not supported on %q", runtime.GOOS) } var f ipv6.ICMPFilter for _, toggle := range []bool{false, true} { f.SetAll(toggle) var wg sync.WaitGroup for _, typ := range []ipv6.ICMPType{ ipv6.ICMPTypeDestinationUnreachable, ipv6.ICMPTypeEchoReply, ipv6.ICMPTypeNeighborSolicitation, ipv6.ICMPTypeDuplicateAddressConfirmation, } { wg.Add(1) go func(typ ipv6.ICMPType) { defer wg.Done() f.Set(typ, false) if f.WillBlock(typ) { t.Errorf("ipv6.ICMPFilter.Set(%v, false) failed", typ) } f.Set(typ, true) if !f.WillBlock(typ) { t.Errorf("ipv6.ICMPFilter.Set(%v, true) failed", typ) } }(typ) } wg.Wait() } } func TestSetICMPFilter(t *testing.T) { switch runtime.GOOS { case "plan9", "windows": t.Skipf("not supported on %q", runtime.GOOS) } if !supportsIPv6 { t.Skip("ipv6 is not supported") } if os.Getuid() != 0 { t.Skip("must be root") } c, err := net.ListenPacket("ip6:ipv6-icmp", "::1") if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() p := ipv6.NewPacketConn(c) var f ipv6.ICMPFilter f.SetAll(true) f.Set(ipv6.ICMPTypeEchoRequest, false) f.Set(ipv6.ICMPTypeEchoReply, false) if err := p.SetICMPFilter(&f); err != nil { t.Fatalf("ipv6.PacketConn.SetICMPFilter failed: %v", err) } kf, err := p.ICMPFilter() if err != nil { t.Fatalf("ipv6.PacketConn.ICMPFilter failed: %v", err) } if !reflect.DeepEqual(kf, &f) { t.Fatalf("got unexpected filter %#v; expected %#v", kf, f) } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/genericopt_plan9.go���������������������������������������������������������������������0000644�0001751�0001751�00000001665�12235217213�016007� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import "syscall" // TrafficClass returns the traffic class field value for outgoing // packets. func (c *genericOpt) TrafficClass() (int, error) { // TODO(mikio): Implement this return 0, syscall.EPLAN9 } // SetTrafficClass sets the traffic class field value for future // outgoing packets. func (c *genericOpt) SetTrafficClass(tclass int) error { // TODO(mikio): Implement this return syscall.EPLAN9 } // HopLimit returns the hop limit field value for outgoing packets. func (c *genericOpt) HopLimit() (int, error) { // TODO(mikio): Implement this return 0, syscall.EPLAN9 } // SetHopLimit sets the hop limit field value for future outgoing // packets. func (c *genericOpt) SetHopLimit(hoplim int) error { // TODO(mikio): Implement this return syscall.EPLAN9 } ���������������������������������������������������������������������������go.net/ipv6/doc.go����������������������������������������������������������������������������������0000644�0001751�0001751�00000013654�12235217213�013313� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package ipv6 implements IP-level socket options for the Internet // Protocol version 6. // // The package provides IP-level socket options that allow // manipulation of IPv6 facilities. The IPv6 and socket options for // IPv6 are defined in RFC 2460, RFC 3493 and RFC 3542. // // // Unicasting // // 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 // a data flow of multiple packets needs to indicate the flow is // important, ipv6.Conn is used to set the traffic class field on the // IPv6 header for each packet. // // ln, err := net.Listen("tcp6", "[::]:1024") // if err != nil { // // error handling // } // defer ln.Close() // for { // c, err := ln.Accept() // if err != nil { // // error handling // } // go func(c net.Conn) { // defer c.Close() // // The outgoing packets will be labeled DiffServ assured forwarding // class 1 low drop precedence, as known as AF11 packets. // // if err := ipv6.NewConn(c).SetTrafficClass(DiffServAF11); err != nil { // // error handling // } // if _, err := c.Write(data); err != nil { // // error handling // } // }(c) // } // // // Multicasting // // 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 // you begin multicasting, at a minimum joining network interfaces and // multicast groups. // // en0, err := net.InterfaceByName("en0") // if err != nil { // // error handling // } // en1, err := net.InterfaceByIndex(911) // if err != nil { // // error handling // } // group := net.ParseIP("ff02::114") // // First, an application listens to an appropriate address with an // appropriate service port. // // c, err := net.ListenPacket("udp6", "[::]:1024") // if err != nil { // // error handling // } // defer c.Close() // // Second, the application joins multicast groups, starts listening to // 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. // // p := ipv6.NewPacketConn(c) // if err := p.JoinGroup(en0, &net.UDPAddr{IP: group}); err != nil { // // error handling // } // if err := p.JoinGroup(en1, &net.UDPAddr{IP: group}); err != nil { // // error handling // } // // The application might set per packet control message transmissions // between the protocol stack within the kernel. When the application // needs a destination address on an incoming packet, // SetControlMessage of ipv6.PacketConn is used to enable control // message transmissons. // // if err := p.SetControlMessage(ipv6.FlagDst, true); err != nil { // // error handling // } // // The application could identify whether the received packets are // of interest by using the control message that contains the // destination address of the received packet. // // b := make([]byte, 1500) // for { // n, rcm, src, err := p.ReadFrom(b) // if err != nil { // // error handling // } // if rcm.Dst.IsMulticast() { // if rcm.Dst.Equal(group) // // joined group, do something // } else { // // unknown group, discard // continue // } // } // // The application can also send both unicast and multicast packets. // // p.SetTrafficClass(DiffServCS0) // p.SetHopLimit(16) // if _, err := p.WriteTo(data[:n], nil, src); err != nil { // // error handling // } // dst := &net.UDPAddr{IP: group, Port: 1024} // wcm := ipv6.ControlMessage{TrafficClass: DiffServCS7, HopLimit: 1} // for _, ifi := range []*net.Interface{en0, en1} { // wcm.IfIndex = ifi.Index // if _, err := p.WriteTo(data[:n], &wcm, dst); err != nil { // // error handling // } // } // } // // // More multicasting // // An application that uses PacketConn may join multiple multicast // groups. For example, a UDP listener with port 1024 might join two // different groups across over two different network interfaces by // using: // // c, err := net.ListenPacket("udp6", "[::]:1024") // if err != nil { // // error handling // } // defer c.Close() // p := ipv6.NewPacketConn(c) // if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::1:114")}); err != nil { // // error handling // } // if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::2:114")}); err != nil { // // error handling // } // if err := p.JoinGroup(en1, &net.UDPAddr{IP: net.ParseIP("ff02::2:114")}); err != nil { // // error handling // } // // It is possible for multiple UDP listeners that listen on the same // 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. // // c1, err := net.ListenPacket("udp6", "[ff02::]:1024") // if err != nil { // // error handling // } // defer c1.Close() // c2, err := net.ListenPacket("udp6", "[ff02::]:1024") // if err != nil { // // error handling // } // defer c2.Close() // p1 := ipv6.NewPacketConn(c1) // if err := p1.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::114")}); err != nil { // // error handling // } // p2 := ipv6.NewPacketConn(c2) // if err := p2.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::114")}); err != nil { // // error handling // } // // Also it is possible for the application to leave or rejoin a // multicast group on the network interface. // // if err := p.LeaveGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::114")}); err != nil { // // error handling // } // if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff01::114")}); err != nil { // // error handling // } package ipv6 ������������������������������������������������������������������������������������go.net/ipv6/control_rfc3542_bsd.go������������������������������������������������������������������0000644�0001751�0001751�00000012740�12235217213�016221� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build freebsd netbsd openbsd package ipv6 import ( "net" "os" "syscall" "unsafe" ) const pktinfo = FlagDst | FlagInterface func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error { opt.Lock() defer opt.Unlock() if cf&FlagTrafficClass != 0 { if err := setIPv6ReceiveTrafficClass(fd, on); err != nil { return err } if on { opt.set(FlagTrafficClass) } else { opt.clear(FlagTrafficClass) } } if cf&FlagHopLimit != 0 { if err := setIPv6ReceiveHopLimit(fd, on); err != nil { return err } if on { opt.set(FlagHopLimit) } else { opt.clear(FlagHopLimit) } } if cf&pktinfo != 0 { if err := setIPv6ReceivePacketInfo(fd, on); err != nil { return err } if on { opt.set(cf & pktinfo) } else { opt.clear(cf & pktinfo) } } if cf&FlagPathMTU != 0 { if err := setIPv6ReceivePathMTU(fd, on); err != nil { return err } if on { opt.set(FlagPathMTU) } else { opt.clear(FlagPathMTU) } } return nil } func newControlMessage(opt *rawOpt) (oob []byte) { opt.Lock() defer opt.Unlock() l, off := 0, 0 if opt.isset(FlagTrafficClass) { l += syscall.CmsgSpace(4) } if opt.isset(FlagHopLimit) { l += syscall.CmsgSpace(4) } if opt.isset(pktinfo) { l += syscall.CmsgSpace(syscall.SizeofInet6Pktinfo) } if opt.isset(FlagPathMTU) { l += syscall.CmsgSpace(syscall.SizeofIPv6MTUInfo) } if l > 0 { oob = make([]byte, l) if opt.isset(FlagTrafficClass) { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_RECVTCLASS m.SetLen(syscall.CmsgLen(4)) off += syscall.CmsgSpace(4) } if opt.isset(FlagHopLimit) { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_RECVHOPLIMIT m.SetLen(syscall.CmsgLen(4)) off += syscall.CmsgSpace(4) } if opt.isset(pktinfo) { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_RECVPKTINFO m.SetLen(syscall.CmsgLen(syscall.SizeofInet6Pktinfo)) off += syscall.CmsgSpace(syscall.SizeofInet6Pktinfo) } if opt.isset(FlagPathMTU) { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_RECVPATHMTU m.SetLen(syscall.CmsgLen(syscall.SizeofIPv6MTUInfo)) off += syscall.CmsgSpace(syscall.SizeofIPv6MTUInfo) } } return } func parseControlMessage(b []byte) (*ControlMessage, error) { if len(b) == 0 { return nil, nil } cmsgs, err := syscall.ParseSocketControlMessage(b) if err != nil { return nil, os.NewSyscallError("parse socket control message", err) } cm := &ControlMessage{} for _, m := range cmsgs { if m.Header.Level != ianaProtocolIPv6 { continue } switch m.Header.Type { case syscall.IPV6_TCLASS: cm.TrafficClass = int(*(*byte)(unsafe.Pointer(&m.Data[:1][0]))) case syscall.IPV6_HOPLIMIT: cm.HopLimit = int(*(*byte)(unsafe.Pointer(&m.Data[:1][0]))) case syscall.IPV6_PKTINFO: pi := (*syscall.Inet6Pktinfo)(unsafe.Pointer(&m.Data[0])) cm.Dst = pi.Addr[:] cm.IfIndex = int(pi.Ifindex) case syscall.IPV6_PATHMTU: mi := (*syscall.IPv6MTUInfo)(unsafe.Pointer(&m.Data[0])) cm.Dst = mi.Addr.Addr[:] cm.IfIndex = int(mi.Addr.Scope_id) cm.MTU = int(mi.Mtu) } } return cm, nil } func marshalControlMessage(cm *ControlMessage) (oob []byte) { if cm == nil { return } l, off := 0, 0 if cm.TrafficClass > 0 { l += syscall.CmsgSpace(4) } if cm.HopLimit > 0 { l += syscall.CmsgSpace(4) } pion := false if cm.Src.To4() == nil && cm.Src.To16() != nil || cm.IfIndex != 0 { pion = true l += syscall.CmsgSpace(syscall.SizeofInet6Pktinfo) } if len(cm.NextHop) == net.IPv6len { l += syscall.CmsgSpace(syscall.SizeofSockaddrInet6) } if l > 0 { oob = make([]byte, l) if cm.TrafficClass > 0 { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_TCLASS m.SetLen(syscall.CmsgLen(4)) data := oob[off+syscall.CmsgLen(0):] *(*byte)(unsafe.Pointer(&data[:1][0])) = byte(cm.TrafficClass) off += syscall.CmsgSpace(4) } if cm.HopLimit > 0 { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_HOPLIMIT m.SetLen(syscall.CmsgLen(4)) data := oob[off+syscall.CmsgLen(0):] *(*byte)(unsafe.Pointer(&data[:1][0])) = byte(cm.HopLimit) off += syscall.CmsgSpace(4) } if pion { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_PKTINFO m.SetLen(syscall.CmsgLen(syscall.SizeofInet6Pktinfo)) pi := (*syscall.Inet6Pktinfo)(unsafe.Pointer(&oob[off+syscall.CmsgLen(0)])) if ip := cm.Src.To16(); ip != nil && ip.To4() == nil { copy(pi.Addr[:], ip) } if cm.IfIndex != 0 { pi.Ifindex = uint32(cm.IfIndex) } off += syscall.CmsgSpace(syscall.SizeofInet6Pktinfo) } if len(cm.NextHop) == net.IPv6len { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_NEXTHOP m.SetLen(syscall.CmsgLen(syscall.SizeofSockaddrInet6)) sa := (*syscall.RawSockaddrInet6)(unsafe.Pointer(&oob[off+syscall.CmsgLen(0)])) sa.Len = syscall.SizeofSockaddrInet6 sa.Family = syscall.AF_INET6 copy(sa.Addr[:], cm.NextHop) sa.Scope_id = uint32(cm.IfIndex) off += syscall.CmsgSpace(syscall.SizeofSockaddrInet6) } } return } ��������������������������������go.net/ipv6/genericopt_posix.go���������������������������������������������������������������������0000644�0001751�0001751�00000002430�12235217213�016115� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin freebsd linux netbsd openbsd windows package ipv6 import "syscall" // TrafficClass returns the traffic class field value for outgoing // packets. func (c *genericOpt) TrafficClass() (int, error) { if !c.ok() { return 0, syscall.EINVAL } fd, err := c.sysfd() if err != nil { return 0, err } return ipv6TrafficClass(fd) } // SetTrafficClass sets the traffic class field value for future // outgoing packets. func (c *genericOpt) SetTrafficClass(tclass int) error { if !c.ok() { return syscall.EINVAL } fd, err := c.sysfd() if err != nil { return err } return setIPv6TrafficClass(fd, tclass) } // HopLimit returns the hop limit field value for outgoing packets. func (c *genericOpt) HopLimit() (int, error) { if !c.ok() { return 0, syscall.EINVAL } fd, err := c.sysfd() if err != nil { return 0, err } return ipv6HopLimit(fd) } // SetHopLimit sets the hop limit field value for future outgoing // packets. func (c *genericOpt) SetHopLimit(hoplim int) error { if !c.ok() { return syscall.EINVAL } fd, err := c.sysfd() if err != nil { return err } return setIPv6HopLimit(fd, hoplim) } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/icmp_windows.go�������������������������������������������������������������������������0000644�0001751�0001751�00000001000�12235217213�015226� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 type rawICMPFilter struct { // TODO(mikio): Implement this } func (f *rawICMPFilter) set(typ ICMPType, block bool) { // TODO(mikio): Implement this } func (f *rawICMPFilter) setAll(block bool) { // TODO(mikio): Implement this } func (f *rawICMPFilter) willBlock(typ ICMPType) bool { // TODO(mikio): Implement this return false } go.net/ipv6/sockopt_rfc3542_plan9.go����������������������������������������������������������������0000644�0001751�0001751�00000000445�12235217213�016475� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import "syscall" func ipv6PathMTU(fd int) (int, error) { // TODO(mikio): Implement this return 0, syscall.EPLAN9 } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/sockopt_rfc3542_bsd.go������������������������������������������������������������������0000644�0001751�0001751�00000002503�12235217213�016217� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build freebsd netbsd openbsd package ipv6 import ( "os" "syscall" ) func ipv6PathMTU(fd int) (int, error) { v, err := syscall.GetsockoptIPv6MTUInfo(fd, ianaProtocolIPv6, syscall.IPV6_PATHMTU) if err != nil { return 0, os.NewSyscallError("getsockopt", err) } return int(v.Mtu), nil } func ipv6ReceivePathMTU(fd int) (bool, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_RECVPATHMTU) if err != nil { return false, os.NewSyscallError("getsockopt", err) } return v == 1, nil } func setIPv6ReceivePathMTU(fd int, v bool) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_RECVPATHMTU, boolint(v))) } func ipv6ICMPFilter(fd int) (*ICMPFilter, error) { v, err := syscall.GetsockoptICMPv6Filter(fd, ianaProtocolIPv6ICMP, syscall.ICMP6_FILTER) if err != nil { return nil, os.NewSyscallError("getsockopt", err) } return &ICMPFilter{rawICMPFilter: rawICMPFilter{*v}}, nil } func setIPv6ICMPFilter(fd int, f *ICMPFilter) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptICMPv6Filter(fd, ianaProtocolIPv6ICMP, syscall.ICMP6_FILTER, &f.rawICMPFilter.ICMPv6Filter)) } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/control_rfc3542_plan9.go����������������������������������������������������������������0000644�0001751�0001751�00000001224�12235217213�016467� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import "syscall" func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error { // TODO(mikio): Implement this return syscall.EPLAN9 } func newControlMessage(opt *rawOpt) (oob []byte) { // TODO(mikio): Implement this return nil } func parseControlMessage(b []byte) (*ControlMessage, error) { // TODO(mikio): Implement this return nil, syscall.EPLAN9 } func marshalControlMessage(cm *ControlMessage) (oob []byte) { // TODO(mikio): Implement this return nil } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/sockopt_rfc3493_linux.go����������������������������������������������������������������0000644�0001751�0001751�00000000634�12235217213�016616� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import ( "os" "syscall" ) func setIPv6Checksum(fd int, on bool, offset int) error { if !on { offset = -1 } return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolReserved, syscall.IPV6_CHECKSUM, offset)) } ����������������������������������������������������������������������������������������������������go.net/ipv6/helper.go�������������������������������������������������������������������������������0000644�0001751�0001751�00000001003�12235217213�014006� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import "net" func boolint(b bool) int { if b { return 1 } return 0 } func netAddrToIP16(a net.Addr) net.IP { switch v := a.(type) { case *net.UDPAddr: if ip := v.IP.To16(); ip != nil && ip.To4() == nil { return ip } case *net.IPAddr: if ip := v.IP.To16(); ip != nil && ip.To4() == nil { return ip } } return nil } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/control_rfc3542_windows.go��������������������������������������������������������������0000644�0001751�0001751�00000001243�12235217213�017137� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import "syscall" func setControlMessage(fd syscall.Handle, opt *rawOpt, cf ControlFlags, on bool) error { // TODO(mikio): Implement this return syscall.EWINDOWS } func newControlMessage(opt *rawOpt) (oob []byte) { // TODO(mikio): Implement this return nil } func parseControlMessage(b []byte) (*ControlMessage, error) { // TODO(mikio): Implement this return nil, syscall.EWINDOWS } func marshalControlMessage(cm *ControlMessage) (oob []byte) { // TODO(mikio): Implement this return nil } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/unicastsockopt_test.go������������������������������������������������������������������0000644�0001751�0001751�00000004552�12235217213�016653� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6_test import ( "code.google.com/p/go.net/ipv6" "net" "os" "runtime" "testing" ) func TestConnUnicastSocketOptions(t *testing.T) { switch runtime.GOOS { case "plan9", "windows": t.Skipf("not supported on %q", runtime.GOOS) } if !supportsIPv6 { t.Skip("ipv6 is not supported") } ln, err := net.Listen("tcp6", "[::1]:0") if err != nil { t.Fatalf("net.Listen failed: %v", err) } defer ln.Close() done := make(chan bool) go acceptor(t, ln, done) c, err := net.Dial("tcp6", ln.Addr().String()) if err != nil { t.Fatalf("net.Dial failed: %v", err) } defer c.Close() testUnicastSocketOptions(t, ipv6.NewConn(c)) <-done } var packetConnUnicastSocketOptionTests = []struct { net, proto, addr string }{ {"udp6", "", "[::1]:0"}, {"ip6", ":ipv6-icmp", "::1"}, } func TestPacketConnUnicastSocketOptions(t *testing.T) { switch runtime.GOOS { case "plan9", "windows": t.Skipf("not supported on %q", runtime.GOOS) } if !supportsIPv6 { t.Skip("ipv6 is not supported") } for _, tt := range packetConnUnicastSocketOptionTests { if tt.net == "ip6" && os.Getuid() != 0 { t.Skip("must be root") } c, err := net.ListenPacket(tt.net+tt.proto, tt.addr) if err != nil { t.Fatalf("net.ListenPacket(%q, %q) failed: %v", tt.net+tt.proto, tt.addr, err) } defer c.Close() testUnicastSocketOptions(t, ipv6.NewPacketConn(c)) } } type testIPv6UnicastConn interface { TrafficClass() (int, error) SetTrafficClass(int) error HopLimit() (int, error) SetHopLimit(int) error } func testUnicastSocketOptions(t *testing.T, c testIPv6UnicastConn) { tclass := DiffServCS0 | NotECNTransport if err := c.SetTrafficClass(tclass); err != nil { t.Fatalf("ipv6.Conn.SetTrafficClass failed: %v", err) } if v, err := c.TrafficClass(); err != nil { t.Fatalf("ipv6.Conn.TrafficClass failed: %v", err) } else if v != tclass { t.Fatalf("got unexpected traffic class %v; expected %v", v, tclass) } hoplim := 255 if err := c.SetHopLimit(hoplim); err != nil { t.Fatalf("ipv6.Conn.SetHopLimit failed: %v", err) } if v, err := c.HopLimit(); err != nil { t.Fatalf("ipv6.Conn.HopLimit failed: %v", err) } else if v != hoplim { t.Fatalf("got unexpected hop limit %v; expected %v", v, hoplim) } } ������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/unicast_test.go�������������������������������������������������������������������������0000644�0001751�0001751�00000014703�12235217213�015247� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6_test import ( "code.google.com/p/go.net/ipv6" "net" "os" "runtime" "testing" "time" ) func benchmarkUDPListener() (net.PacketConn, net.Addr, error) { c, err := net.ListenPacket("udp6", "[::1]:0") if err != nil { return nil, nil, err } dst, err := net.ResolveUDPAddr("udp6", c.LocalAddr().String()) if err != nil { c.Close() return nil, nil, err } return c, dst, nil } func BenchmarkReadWriteNetUDP(b *testing.B) { c, dst, err := benchmarkUDPListener() if err != nil { b.Fatalf("benchmarkUDPListener failed: %v", err) } defer c.Close() wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128) b.ResetTimer() for i := 0; i < b.N; i++ { benchmarkReadWriteNetUDP(b, c, wb, rb, dst) } } func benchmarkReadWriteNetUDP(b *testing.B, c net.PacketConn, wb, rb []byte, dst net.Addr) { if _, err := c.WriteTo(wb, dst); err != nil { b.Fatalf("net.PacketConn.WriteTo failed: %v", err) } if _, _, err := c.ReadFrom(rb); err != nil { b.Fatalf("net.PacketConn.ReadFrom failed: %v", err) } } func BenchmarkReadWriteIPv6UDP(b *testing.B) { c, dst, err := benchmarkUDPListener() if err != nil { b.Fatalf("benchmarkUDPListener failed: %v", err) } defer c.Close() p := ipv6.NewPacketConn(c) cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagInterface | ipv6.FlagPathMTU if err := p.SetControlMessage(cf, true); err != nil { b.Fatalf("ipv6.PacketConn.SetControlMessage failed: %v", err) } ifi := loopbackInterface() wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128) b.ResetTimer() for i := 0; i < b.N; i++ { benchmarkReadWriteIPv6UDP(b, p, wb, rb, dst, ifi) } } func benchmarkReadWriteIPv6UDP(b *testing.B, p *ipv6.PacketConn, wb, rb []byte, dst net.Addr, ifi *net.Interface) { cm := ipv6.ControlMessage{ TrafficClass: DiffServAF11 | CongestionExperienced, HopLimit: 1, } if ifi != nil { cm.IfIndex = ifi.Index } if _, err := p.WriteTo(wb, &cm, dst); err != nil { b.Fatalf("ipv6.PacketConn.WriteTo failed: %v", err) } if _, _, _, err := p.ReadFrom(rb); err != nil { b.Fatalf("ipv6.PacketConn.ReadFrom failed: %v", err) } } func TestPacketConnReadWriteUnicastUDP(t *testing.T) { switch runtime.GOOS { case "plan9", "windows": t.Skipf("not supported on %q", runtime.GOOS) } if !supportsIPv6 { t.Skip("ipv6 is not supported") } c, err := net.ListenPacket("udp6", "[::1]:0") if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() dst, err := net.ResolveUDPAddr("udp6", c.LocalAddr().String()) if err != nil { t.Fatalf("net.ResolveUDPAddr failed: %v", err) } p := ipv6.NewPacketConn(c) defer p.Close() cm := ipv6.ControlMessage{ TrafficClass: DiffServAF11 | CongestionExperienced, } cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagInterface | ipv6.FlagPathMTU ifi := loopbackInterface() if ifi != nil { cm.IfIndex = ifi.Index } for i, toggle := range []bool{true, false, true} { if err := p.SetControlMessage(cf, toggle); err != nil { t.Fatalf("ipv6.PacketConn.SetControlMessage failed: %v", err) } cm.HopLimit = i + 1 if err := p.SetWriteDeadline(time.Now().Add(time.Millisecond * 100)); err != nil { t.Fatalf("ipv6.PacketConn.SetWriteDeadline failed: %v", err) } if _, err := p.WriteTo([]byte("HELLO-R-U-THERE"), &cm, dst); err != nil { t.Fatalf("ipv6.PacketConn.WriteTo failed: %v", err) } b := make([]byte, 128) if err := p.SetReadDeadline(time.Now().Add(time.Millisecond * 100)); err != nil { t.Fatalf("ipv6.PacketConn.SetReadDeadline failed: %v", err) } if _, cm, _, err := p.ReadFrom(b); err != nil { t.Fatalf("ipv6.PacketConn.ReadFrom failed: %v", err) } else { t.Logf("rcvd cmsg: %v", cm) } } } func TestPacketConnReadWriteUnicastICMP(t *testing.T) { switch runtime.GOOS { case "plan9", "windows": t.Skipf("not supported on %q", runtime.GOOS) } if !supportsIPv6 { t.Skip("ipv6 is not supported") } if os.Getuid() != 0 { t.Skip("must be root") } c, err := net.ListenPacket("ip6:ipv6-icmp", "::1") if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() dst, err := net.ResolveIPAddr("ip6", "::1") if err != nil { t.Fatalf("net.ResolveIPAddr failed: %v", err) } pshicmp := ipv6PseudoHeader(c.LocalAddr().(*net.IPAddr).IP, dst.IP, ianaProtocolIPv6ICMP) p := ipv6.NewPacketConn(c) defer p.Close() cm := ipv6.ControlMessage{TrafficClass: DiffServAF11 | CongestionExperienced} cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagInterface | ipv6.FlagPathMTU ifi := loopbackInterface() if ifi != nil { cm.IfIndex = ifi.Index } var f ipv6.ICMPFilter f.SetAll(true) f.Set(ipv6.ICMPTypeEchoReply, false) if err := p.SetICMPFilter(&f); err != nil { t.Fatalf("ipv6.PacketConn.SetICMPFilter failed: %v", err) } var psh []byte for i, toggle := range []bool{true, false, true} { if toggle { psh = nil if err := p.SetChecksum(true, 2); err != nil { t.Fatalf("ipv6.PacketConn.SetChecksum failed: %v", err) } } else { psh = pshicmp // Some platforms never allow to disable the // kernel checksum processing. p.SetChecksum(false, -1) } wb, err := (&icmpMessage{ Type: ipv6.ICMPTypeEchoRequest, Code: 0, Body: &icmpEcho{ ID: os.Getpid() & 0xffff, Seq: i + 1, Data: []byte("HELLO-R-U-THERE"), }, }).Marshal(psh) if err != nil { t.Fatalf("icmpMessage.Marshal failed: %v", err) } if err := p.SetControlMessage(cf, toggle); err != nil { t.Fatalf("ipv6.PacketConn.SetControlMessage failed: %v", err) } cm.HopLimit = i + 1 if err := p.SetWriteDeadline(time.Now().Add(time.Millisecond * 100)); err != nil { t.Fatalf("ipv6.PacketConn.SetWriteDeadline failed: %v", err) } if _, err := p.WriteTo(wb, &cm, dst); err != nil { t.Fatalf("ipv6.PacketConn.WriteTo failed: %v", err) } b := make([]byte, 128) if err := p.SetReadDeadline(time.Now().Add(time.Millisecond * 100)); err != nil { t.Fatalf("ipv6.PacketConn.SetReadDeadline failed: %v", err) } if n, cm, _, err := p.ReadFrom(b); err != nil { t.Fatalf("ipv6.PacketConn.ReadFrom failed: %v", err) } else { t.Logf("rcvd cmsg: %v", cm) if m, err := parseICMPMessage(b[:n]); err != nil { t.Fatalf("parseICMPMessage failed: %v", err) } else if m.Type != ipv6.ICMPTypeEchoReply || m.Code != 0 { t.Fatalf("got type=%v, code=%v; expected type=%v, code=%v", m.Type, m.Code, ipv6.ICMPTypeEchoReply, 0) } } } } �������������������������������������������������������������go.net/ipv6/control_rfc3542_linux.go����������������������������������������������������������������0000644�0001751�0001751�00000013054�12235217213�016607� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import ( "net" "os" "syscall" "unsafe" ) const ( // See /usr/include/linux/in6.h. syscall_IPV6_RECVPATHMTU = syscall.IPV6_DSTOPTS + 1 + iota syscall_IPV6_PATHMTU syscall_IPV6_DONTFRAG ) const pktinfo = FlagDst | FlagInterface func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error { opt.Lock() defer opt.Unlock() if cf&FlagTrafficClass != 0 { if err := setIPv6ReceiveTrafficClass(fd, on); err != nil { return err } if on { opt.set(FlagTrafficClass) } else { opt.clear(FlagTrafficClass) } } if cf&FlagHopLimit != 0 { if err := setIPv6ReceiveHopLimit(fd, on); err != nil { return err } if on { opt.set(FlagHopLimit) } else { opt.clear(FlagHopLimit) } } if cf&pktinfo != 0 { if err := setIPv6ReceivePacketInfo(fd, on); err != nil { return err } if on { opt.set(cf & pktinfo) } else { opt.clear(cf & pktinfo) } } if cf&FlagPathMTU != 0 { if err := setIPv6ReceivePathMTU(fd, on); err != nil { return err } if on { opt.set(FlagPathMTU) } else { opt.clear(FlagPathMTU) } } return nil } func newControlMessage(opt *rawOpt) (oob []byte) { opt.Lock() defer opt.Unlock() l, off := 0, 0 if opt.isset(FlagTrafficClass) { l += syscall.CmsgSpace(4) } if opt.isset(FlagHopLimit) { l += syscall.CmsgSpace(4) } if opt.isset(pktinfo) { l += syscall.CmsgSpace(syscall.SizeofInet6Pktinfo) } if opt.isset(FlagPathMTU) { l += syscall.CmsgSpace(syscall.SizeofIPv6MTUInfo) } if l > 0 { oob = make([]byte, l) if opt.isset(FlagTrafficClass) { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_RECVTCLASS m.SetLen(syscall.CmsgLen(4)) off += syscall.CmsgSpace(4) } if opt.isset(FlagHopLimit) { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_RECVHOPLIMIT m.SetLen(syscall.CmsgLen(4)) off += syscall.CmsgSpace(4) } if opt.isset(pktinfo) { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_RECVPKTINFO m.SetLen(syscall.CmsgLen(syscall.SizeofInet6Pktinfo)) off += syscall.CmsgSpace(syscall.SizeofInet6Pktinfo) } if opt.isset(FlagPathMTU) { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall_IPV6_RECVPATHMTU m.SetLen(syscall.CmsgLen(syscall.SizeofIPv6MTUInfo)) off += syscall.CmsgSpace(syscall.SizeofIPv6MTUInfo) } } return } func parseControlMessage(b []byte) (*ControlMessage, error) { if len(b) == 0 { return nil, nil } cmsgs, err := syscall.ParseSocketControlMessage(b) if err != nil { return nil, os.NewSyscallError("parse socket control message", err) } cm := &ControlMessage{} for _, m := range cmsgs { if m.Header.Level != ianaProtocolIPv6 { continue } switch m.Header.Type { case syscall.IPV6_TCLASS: cm.TrafficClass = int(*(*byte)(unsafe.Pointer(&m.Data[:1][0]))) case syscall.IPV6_HOPLIMIT: cm.HopLimit = int(*(*byte)(unsafe.Pointer(&m.Data[:1][0]))) case syscall.IPV6_PKTINFO: pi := (*syscall.Inet6Pktinfo)(unsafe.Pointer(&m.Data[0])) cm.Dst = pi.Addr[:] cm.IfIndex = int(pi.Ifindex) case syscall_IPV6_PATHMTU: mi := (*syscall.IPv6MTUInfo)(unsafe.Pointer(&m.Data[0])) cm.Dst = mi.Addr.Addr[:] cm.IfIndex = int(mi.Addr.Scope_id) cm.MTU = int(mi.Mtu) } } return cm, nil } func marshalControlMessage(cm *ControlMessage) (oob []byte) { if cm == nil { return } l, off := 0, 0 if cm.TrafficClass > 0 { l += syscall.CmsgSpace(4) } if cm.HopLimit > 0 { l += syscall.CmsgSpace(4) } pion := false if cm.Src.To4() == nil && cm.Src.To16() != nil || cm.IfIndex != 0 { pion = true l += syscall.CmsgSpace(syscall.SizeofInet6Pktinfo) } if len(cm.NextHop) == net.IPv6len { l += syscall.CmsgSpace(syscall.SizeofSockaddrInet6) } if l > 0 { oob = make([]byte, l) if cm.TrafficClass > 0 { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_TCLASS m.SetLen(syscall.CmsgLen(4)) data := oob[off+syscall.CmsgLen(0):] *(*byte)(unsafe.Pointer(&data[:1][0])) = byte(cm.TrafficClass) off += syscall.CmsgSpace(4) } if cm.HopLimit > 0 { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_HOPLIMIT m.SetLen(syscall.CmsgLen(4)) data := oob[off+syscall.CmsgLen(0):] *(*byte)(unsafe.Pointer(&data[:1][0])) = byte(cm.HopLimit) off += syscall.CmsgSpace(4) } if pion { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_PKTINFO m.SetLen(syscall.CmsgLen(syscall.SizeofInet6Pktinfo)) pi := (*syscall.Inet6Pktinfo)(unsafe.Pointer(&oob[off+syscall.CmsgLen(0)])) if ip := cm.Src.To16(); ip != nil && ip.To4() == nil { copy(pi.Addr[:], ip) } if cm.IfIndex != 0 { pi.Ifindex = uint32(cm.IfIndex) } off += syscall.CmsgSpace(syscall.SizeofInet6Pktinfo) } if len(cm.NextHop) == net.IPv6len { m := (*syscall.Cmsghdr)(unsafe.Pointer(&oob[off])) m.Level = ianaProtocolIPv6 m.Type = syscall.IPV6_NEXTHOP m.SetLen(syscall.CmsgLen(syscall.SizeofSockaddrInet6)) sa := (*syscall.RawSockaddrInet6)(unsafe.Pointer(&oob[off+syscall.CmsgLen(0)])) sa.Family = syscall.AF_INET6 copy(sa.Addr[:], cm.NextHop) sa.Scope_id = uint32(cm.IfIndex) off += syscall.CmsgSpace(syscall.SizeofSockaddrInet6) } } return } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/payload.go������������������������������������������������������������������������������0000644�0001751�0001751�00000000605�12235217213�014167� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import "net" // A payloadHandler represents the IPv6 datagram payload handler. type payloadHandler struct { net.PacketConn rawOpt } func (c *payloadHandler) ok() bool { return c != nil && c.PacketConn != nil } ���������������������������������������������������������������������������������������������������������������������������go.net/ipv6/helper_plan9.go�������������������������������������������������������������������������0000644�0001751�0001751�00000000775�12235217213�015130� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import "syscall" func (c *genericOpt) sysfd() (int, error) { // TODO(mikio): Implement this return 0, syscall.EPLAN9 } func (c *dgramOpt) sysfd() (int, error) { // TODO(mikio): Implement this return 0, syscall.EPLAN9 } func (c *payloadHandler) sysfd() (int, error) { // TODO(mikio): Implement this return 0, syscall.EPLAN9 } ���go.net/ipv6/multicastlistener_test.go���������������������������������������������������������������0000644�0001751�0001751�00000014265�12235217213�017357� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6_test import ( "code.google.com/p/go.net/ipv6" "fmt" "net" "os" "runtime" "testing" ) var udpMultipleGroupListenerTests = []net.Addr{ &net.UDPAddr{IP: net.ParseIP("ff02::114")}, // see RFC 4727 &net.UDPAddr{IP: net.ParseIP("ff02::1:114")}, &net.UDPAddr{IP: net.ParseIP("ff02::2:114")}, } func TestUDPSinglePacketConnWithMultipleGroupListeners(t *testing.T) { switch runtime.GOOS { case "plan9", "windows": t.Skipf("not supported on %q", runtime.GOOS) } if !supportsIPv6 { t.Skip("ipv6 is not supported") } for _, gaddr := range udpMultipleGroupListenerTests { c, err := net.ListenPacket("udp6", "[::]:0") // wildcard address with non-reusable port if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() p := ipv6.NewPacketConn(c) var mift []*net.Interface ift, err := net.Interfaces() if err != nil { t.Fatalf("net.Interfaces failed: %v", err) } for i, ifi := range ift { if _, ok := isMulticastAvailable(&ifi); !ok { continue } if err := p.JoinGroup(&ifi, gaddr); err != nil { t.Fatalf("ipv6.PacketConn.JoinGroup %v on %v failed: %v", gaddr, ifi, err) } mift = append(mift, &ift[i]) } for _, ifi := range mift { if err := p.LeaveGroup(ifi, gaddr); err != nil { t.Fatalf("ipv6.PacketConn.LeaveGroup %v on %v failed: %v", gaddr, ifi, err) } } } } func TestUDPMultiplePacketConnWithMultipleGroupListeners(t *testing.T) { switch runtime.GOOS { case "plan9", "windows": t.Skipf("not supported on %q", runtime.GOOS) } if !supportsIPv6 { t.Skip("ipv6 is not supported") } for _, gaddr := range udpMultipleGroupListenerTests { c1, err := net.ListenPacket("udp6", "[ff02::]:1024") // wildcard address with reusable port if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c1.Close() c2, err := net.ListenPacket("udp6", "[ff02::]:1024") // wildcard address with reusable port if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c2.Close() var ps [2]*ipv6.PacketConn ps[0] = ipv6.NewPacketConn(c1) ps[1] = ipv6.NewPacketConn(c2) var mift []*net.Interface ift, err := net.Interfaces() if err != nil { t.Fatalf("net.Interfaces failed: %v", err) } for i, ifi := range ift { if _, ok := isMulticastAvailable(&ifi); !ok { continue } for _, p := range ps { if err := p.JoinGroup(&ifi, gaddr); err != nil { t.Fatalf("ipv6.PacketConn.JoinGroup %v on %v failed: %v", gaddr, ifi, err) } } mift = append(mift, &ift[i]) } for _, ifi := range mift { for _, p := range ps { if err := p.LeaveGroup(ifi, gaddr); err != nil { t.Fatalf("ipv6.PacketConn.LeaveGroup %v on %v failed: %v", gaddr, ifi, err) } } } } } func TestUDPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) { switch runtime.GOOS { case "plan9", "windows": t.Skipf("not supported on %q", runtime.GOOS) } if !supportsIPv6 { t.Skip("ipv6 is not supported") } gaddr := net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727 type ml struct { c *ipv6.PacketConn ifi *net.Interface } var mlt []*ml ift, err := net.Interfaces() if err != nil { t.Fatalf("net.Interfaces failed: %v", err) } for i, ifi := range ift { ip, ok := isMulticastAvailable(&ifi) if !ok { continue } c, err := net.ListenPacket("udp6", fmt.Sprintf("[%s%%%s]:1024", ip.String(), ifi.Name)) // unicast address with non-reusable port if err != nil { t.Fatalf("net.ListenPacket with %v failed: %v", ip, err) } defer c.Close() p := ipv6.NewPacketConn(c) if err := p.JoinGroup(&ifi, &gaddr); err != nil { t.Fatalf("ipv6.PacketConn.JoinGroup on %v failed: %v", ifi, err) } mlt = append(mlt, &ml{p, &ift[i]}) } for _, m := range mlt { if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil { t.Fatalf("ipv6.PacketConn.LeaveGroup on %v failed: %v", m.ifi, err) } } } func TestIPSinglePacketConnWithSingleGroupListener(t *testing.T) { switch runtime.GOOS { case "plan9", "windows": t.Skipf("not supported on %q", runtime.GOOS) } if !supportsIPv6 { t.Skip("ipv6 is not supported") } if os.Getuid() != 0 { t.Skip("must be root") } c, err := net.ListenPacket("ip6:ipv6-icmp", "::") // wildcard address if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() p := ipv6.NewPacketConn(c) gaddr := net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727 var mift []*net.Interface ift, err := net.Interfaces() if err != nil { t.Fatalf("net.Interfaces failed: %v", err) } for i, ifi := range ift { if _, ok := isMulticastAvailable(&ifi); !ok { continue } if err := p.JoinGroup(&ifi, &gaddr); err != nil { t.Fatalf("ipv6.PacketConn.JoinGroup on %v failed: %v", ifi, err) } mift = append(mift, &ift[i]) } for _, ifi := range mift { if err := p.LeaveGroup(ifi, &gaddr); err != nil { t.Fatalf("ipv6.PacketConn.LeaveGroup on %v failed: %v", ifi, err) } } } func TestIPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) { switch runtime.GOOS { case "darwin", "plan9", "windows": t.Skipf("not supported on %q", runtime.GOOS) } if !supportsIPv6 { t.Skip("ipv6 is not supported") } if os.Getuid() != 0 { t.Skip("must be root") } gaddr := net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727 type ml struct { c *ipv6.PacketConn ifi *net.Interface } var mlt []*ml ift, err := net.Interfaces() if err != nil { t.Fatalf("net.Interfaces failed: %v", err) } for i, ifi := range ift { ip, ok := isMulticastAvailable(&ifi) if !ok { continue } c, err := net.ListenPacket("ip6:ipv6-icmp", fmt.Sprintf("%s%%%s", ip.String(), ifi.Name)) // unicast address if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() p := ipv6.NewPacketConn(c) if err := p.JoinGroup(&ifi, &gaddr); err != nil { t.Fatalf("ipv6.PacketConn.JoinGroup on %v failed: %v", ifi, err) } mlt = append(mlt, &ml{p, &ift[i]}) } for _, m := range mlt { if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil { t.Fatalf("ipv6.PacketConn.LeaveGroup on %v failed: %v", m.ifi, err) } } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/mockicmp_test.go������������������������������������������������������������������������0000644�0001751�0001751�00000006166�12235217213�015407� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6_test import ( "code.google.com/p/go.net/ipv6" "errors" "net" ) const ( ipv6PseudoHeaderLen = 2*net.IPv6len + 8 ianaProtocolIPv6ICMP = 58 ) func ipv6PseudoHeader(src, dst net.IP, nextHeader int) []byte { b := make([]byte, ipv6PseudoHeaderLen) copy(b[:net.IPv6len], src) copy(b[net.IPv6len:], dst) b[len(b)-1] = byte(nextHeader) return b } // icmpMessage represents an ICMP message. type icmpMessage struct { Type ipv6.ICMPType // type Code int // code Checksum int // checksum Body icmpMessageBody // body } // icmpMessageBody represents an ICMP message body. type icmpMessageBody interface { Len() int Marshal() ([]byte, error) } // Marshal returns the binary enconding of the ICMP echo request or // reply message m. func (m *icmpMessage) Marshal(psh []byte) ([]byte, error) { b := []byte{byte(m.Type), byte(m.Code), 0, 0} if psh != nil { b = append(psh, b...) } if m.Body != nil && m.Body.Len() != 0 { mb, err := m.Body.Marshal() if err != nil { return nil, err } b = append(b, mb...) } if psh == nil { return b, nil } off, l := 2*net.IPv6len, len(b)-len(psh) b[off], b[off+1], b[off+2], b[off+3] = byte(l>>24), byte(l>>16), byte(l>>8), byte(l) csumcv := len(b) - 1 // checksum coverage s := uint32(0) for i := 0; i < csumcv; i += 2 { s += uint32(b[i+1])<<8 | uint32(b[i]) } if csumcv&1 == 0 { s += uint32(b[csumcv]) } s = s>>16 + s&0xffff s = s + s>>16 // Place checksum back in header; using ^= avoids the // assumption the checksum bytes are zero. b[len(psh)+2] ^= byte(^s) b[len(psh)+3] ^= byte(^s >> 8) return b[len(psh):], nil } // parseICMPMessage parses b as an ICMP message. func parseICMPMessage(b []byte) (*icmpMessage, error) { msglen := len(b) if msglen < 4 { return nil, errors.New("message too short") } m := &icmpMessage{Type: ipv6.ICMPType(b[0]), Code: int(b[1]), Checksum: int(b[2])<<8 | int(b[3])} if msglen > 4 { var err error switch m.Type { case ipv6.ICMPTypeEchoRequest, ipv6.ICMPTypeEchoReply: m.Body, err = parseICMPEcho(b[4:]) if err != nil { return nil, err } } } return m, nil } // imcpEcho represenets an ICMP echo request or reply message body. type icmpEcho struct { ID int // identifier Seq int // sequence number Data []byte // data } func (p *icmpEcho) Len() int { if p == nil { return 0 } return 4 + len(p.Data) } // Marshal returns the binary enconding of the ICMP echo request or // reply message body p. func (p *icmpEcho) Marshal() ([]byte, error) { b := make([]byte, 4+len(p.Data)) b[0], b[1] = byte(p.ID>>8), byte(p.ID) b[2], b[3] = byte(p.Seq>>8), byte(p.Seq) copy(b[4:], p.Data) return b, nil } // parseICMPEcho parses b as an ICMP echo request or reply message // body. func parseICMPEcho(b []byte) (*icmpEcho, error) { bodylen := len(b) p := &icmpEcho{ID: int(b[0])<<8 | int(b[1]), Seq: int(b[2])<<8 | int(b[3])} if bodylen > 4 { p.Data = make([]byte, bodylen-4) copy(p.Data, b[4:]) } return p, nil } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/sockopt_rfc3493_windows.go��������������������������������������������������������������0000644�0001751�0001751�00000007160�12235217213�017152� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import ( "net" "os" "syscall" "unsafe" ) func ipv6TrafficClass(fd syscall.Handle) (int, error) { // TODO(mikio): Implement this return 0, syscall.EWINDOWS } func setIPv6TrafficClass(fd syscall.Handle, v int) error { // TODO(mikio): Implement this return syscall.EWINDOWS } func ipv6HopLimit(fd syscall.Handle) (int, error) { var v int32 l := int32(4) if err := syscall.Getsockopt(fd, ianaProtocolIPv6, syscall.IPV6_UNICAST_HOPS, (*byte)(unsafe.Pointer(&v)), &l); err != nil { return 0, os.NewSyscallError("getsockopt", err) } return int(v), nil } func setIPv6HopLimit(fd syscall.Handle, v int) error { vv := int32(v) return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIPv6, syscall.IPV6_UNICAST_HOPS, (*byte)(unsafe.Pointer(&vv)), 4)) } func ipv6Checksum(fd syscall.Handle) (bool, int, error) { // TODO(mikio): Implement this return false, 0, syscall.EWINDOWS } func ipv6MulticastHopLimit(fd syscall.Handle) (int, error) { var v int32 l := int32(4) if err := syscall.Getsockopt(fd, ianaProtocolIPv6, syscall.IPV6_MULTICAST_HOPS, (*byte)(unsafe.Pointer(&v)), &l); err != nil { return 0, os.NewSyscallError("getsockopt", err) } return int(v), nil } func setIPv6MulticastHopLimit(fd syscall.Handle, v int) error { vv := int32(v) return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIPv6, syscall.IPV6_MULTICAST_HOPS, (*byte)(unsafe.Pointer(&vv)), 4)) } func ipv6MulticastInterface(fd syscall.Handle) (*net.Interface, error) { var v int32 l := int32(4) if err := syscall.Getsockopt(fd, ianaProtocolIPv6, syscall.IPV6_MULTICAST_IF, (*byte)(unsafe.Pointer(&v)), &l); err != nil { return nil, os.NewSyscallError("getsockopt", err) } if v == 0 { return nil, nil } ifi, err := net.InterfaceByIndex(int(v)) if err != nil { return nil, err } return ifi, nil } func setIPv6MulticastInterface(fd syscall.Handle, ifi *net.Interface) error { var v int32 if ifi != nil { v = int32(ifi.Index) } return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIPv6, syscall.IPV6_MULTICAST_IF, (*byte)(unsafe.Pointer(&v)), 4)) } func ipv6MulticastLoopback(fd syscall.Handle) (bool, error) { var v int32 l := int32(4) if err := syscall.Getsockopt(fd, ianaProtocolIPv6, syscall.IPV6_MULTICAST_LOOP, (*byte)(unsafe.Pointer(&v)), &l); err != nil { return false, os.NewSyscallError("getsockopt", err) } return v == 1, nil } func setIPv6MulticastLoopback(fd syscall.Handle, v bool) error { vv := int32(boolint(v)) return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIPv6, syscall.IPV6_MULTICAST_LOOP, (*byte)(unsafe.Pointer(&vv)), 4)) } func joinIPv6Group(fd syscall.Handle, ifi *net.Interface, grp net.IP) error { mreq := syscall.IPv6Mreq{} copy(mreq.Multiaddr[:], grp) if ifi != nil { mreq.Interface = uint32(ifi.Index) } return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIPv6, syscall.IPV6_JOIN_GROUP, (*byte)(unsafe.Pointer(&mreq)), int32(unsafe.Sizeof(mreq)))) } func leaveIPv6Group(fd syscall.Handle, ifi *net.Interface, grp net.IP) error { mreq := syscall.IPv6Mreq{} copy(mreq.Multiaddr[:], grp) if ifi != nil { mreq.Interface = uint32(ifi.Index) } return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIPv6, syscall.IPV6_LEAVE_GROUP, (*byte)(unsafe.Pointer(&mreq)), int32(unsafe.Sizeof(mreq)))) } func setIPv6Checksum(fd syscall.Handle, on bool, offset int) error { // TODO(mikio): Implement this return syscall.EWINDOWS } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/sockopt_test.go�������������������������������������������������������������������������0000644�0001751�0001751�00000006002�12235217213�015254� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6_test import ( "code.google.com/p/go.net/ipv6" "net" "os" "runtime" "testing" ) var supportsIPv6 bool func init() { if ln, err := net.Listen("tcp6", "[::1]:0"); err == nil { ln.Close() supportsIPv6 = true } } var condFatalf = func() func(*testing.T, string, ...interface{}) { // A few APIs are not implemented yet on some platforms. switch runtime.GOOS { case "darwin", "plan9", "windows": return (*testing.T).Logf } return (*testing.T).Fatalf }() func TestConnInitiatorPathMTU(t *testing.T) { switch runtime.GOOS { case "plan9", "windows": t.Skipf("not supported on %q", runtime.GOOS) } if !supportsIPv6 { t.Skip("ipv6 is not supported") } ln, err := net.Listen("tcp6", "[::1]:0") if err != nil { t.Fatalf("net.Listen failed: %v", err) } defer ln.Close() done := make(chan bool) go acceptor(t, ln, done) c, err := net.Dial("tcp6", ln.Addr().String()) if err != nil { t.Fatalf("net.Dial failed: %v", err) } defer c.Close() if pmtu, err := ipv6.NewConn(c).PathMTU(); err != nil { condFatalf(t, "ipv6.Conn.PathMTU failed: %v", err) } else { t.Logf("path mtu for %v: %v", c.RemoteAddr(), pmtu) } <-done } func TestConnResponderPathMTU(t *testing.T) { switch runtime.GOOS { case "plan9", "windows": t.Skipf("not supported on %q", runtime.GOOS) } if !supportsIPv6 { t.Skip("ipv6 is not supported") } ln, err := net.Listen("tcp6", "[::1]:0") if err != nil { t.Fatalf("net.Listen failed: %v", err) } defer ln.Close() done := make(chan bool) go connector(t, "tcp6", ln.Addr().String(), done) c, err := ln.Accept() if err != nil { t.Fatalf("net.Accept failed: %v", err) } defer c.Close() if pmtu, err := ipv6.NewConn(c).PathMTU(); err != nil { condFatalf(t, "ipv6.Conn.PathMTU failed: %v", err) } else { t.Logf("path mtu for %v: %v", c.RemoteAddr(), pmtu) } <-done } func TestPacketConnChecksum(t *testing.T) { switch runtime.GOOS { case "plan9", "windows": t.Skipf("not supported on %q", runtime.GOOS) } if !supportsIPv6 { t.Skip("ipv6 is not supported") } if os.Getuid() != 0 { t.Skip("must be root") } c, err := net.ListenPacket("ip6:89", "::") // OSPF for IPv6 if err != nil { t.Fatalf("net.ListenPacket failed: %v", err) } defer c.Close() p := ipv6.NewPacketConn(c) offset := 12 // see RFC 5340 for _, toggle := range []bool{false, true} { if err := p.SetChecksum(toggle, offset); err != nil { if toggle { t.Fatalf("ipv6.PacketConn.SetChecksum(%v, %v) failed: %v", toggle, offset, err) } else { // Some platforms never allow to disable the kernel // checksum processing. t.Logf("ipv6.PacketConn.SetChecksum(%v, %v) failed: %v", toggle, offset, err) } } if on, offset, err := p.Checksum(); err != nil { t.Fatalf("ipv6.PacketConn.Checksum failed: %v", err) } else { t.Logf("kernel checksum processing enabled=%v, offset=%v", on, offset) } } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/sockopt_rfc2292_darwin.go���������������������������������������������������������������0000644�0001751�0001751�00000003561�12235217213�016741� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import ( "os" "syscall" ) func ipv6ReceiveTrafficClass(fd int) (bool, error) { return false, errNotSupported } func setIPv6ReceiveTrafficClass(fd int, v bool) error { return errNotSupported } func ipv6ReceiveHopLimit(fd int) (bool, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_2292HOPLIMIT) if err != nil { return false, os.NewSyscallError("getsockopt", err) } return v == 1, nil } func setIPv6ReceiveHopLimit(fd int, v bool) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_2292HOPLIMIT, boolint(v))) } func ipv6ReceivePacketInfo(fd int) (bool, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_2292PKTINFO) if err != nil { return false, os.NewSyscallError("getsockopt", err) } return v == 1, nil } func setIPv6ReceivePacketInfo(fd int, v bool) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_2292PKTINFO, boolint(v))) } func ipv6PathMTU(fd int) (int, error) { return 0, errNotSupported } func ipv6ReceivePathMTU(fd int) (bool, error) { return false, errNotSupported } func setIPv6ReceivePathMTU(fd int, v bool) error { return errNotSupported } func ipv6ICMPFilter(fd int) (*ICMPFilter, error) { v, err := syscall.GetsockoptICMPv6Filter(fd, ianaProtocolIPv6ICMP, syscall.ICMP6_FILTER) if err != nil { return nil, os.NewSyscallError("getsockopt", err) } return &ICMPFilter{rawICMPFilter: rawICMPFilter{*v}}, nil } func setIPv6ICMPFilter(fd int, f *ICMPFilter) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptICMPv6Filter(fd, ianaProtocolIPv6ICMP, syscall.ICMP6_FILTER, &f.rawICMPFilter.ICMPv6Filter)) } �����������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/icmp_plan9.go���������������������������������������������������������������������������0000644�0001751�0001751�00000001000�12235217213�014557� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 type rawICMPFilter struct { // TODO(mikio): Implement this } func (f *rawICMPFilter) set(typ ICMPType, block bool) { // TODO(mikio): Implement this } func (f *rawICMPFilter) setAll(block bool) { // TODO(mikio): Implement this } func (f *rawICMPFilter) willBlock(typ ICMPType) bool { // TODO(mikio): Implement this return false } go.net/ipv6/gentest.go������������������������������������������������������������������������������0000644�0001751�0001751�00000010371�12235217213�014210� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build ignore // This program generates internet protocol constants by reading IANA // protocol registries. // // Usage: // go run gentest.go > iana_test.go package main import ( "bytes" "encoding/xml" "fmt" "go/format" "io" "net/http" "os" "strconv" "strings" ) var registries = []struct { url string parse func(io.Writer, io.Reader) error }{ { "http://www.iana.org/assignments/dscp-registry/dscp-registry.xml", parseDSCPRegistry, }, { "http://www.iana.org/assignments/ipv4-tos-byte/ipv4-tos-byte.xml", parseTOSTCByte, }, } func main() { var bb bytes.Buffer fmt.Fprintf(&bb, "// go run gentest.go\n") fmt.Fprintf(&bb, "// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n") fmt.Fprintf(&bb, "package ipv6_test\n\n") for _, r := range registries { resp, err := http.Get(r.url) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { fmt.Fprintf(os.Stderr, "got HTTP status code %v for %v\n", resp.StatusCode, r.url) os.Exit(1) } if err := r.parse(&bb, resp.Body); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } fmt.Fprintf(&bb, "\n") } b, err := format.Source(bb.Bytes()) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } os.Stdout.Write(b) } func parseDSCPRegistry(w io.Writer, r io.Reader) error { dec := xml.NewDecoder(r) var dr dscpRegistry if err := dec.Decode(&dr); err != nil { return err } drs := dr.escape() fmt.Fprintf(w, "// %s, Updated: %s\n", dr.Title, dr.Updated) fmt.Fprintf(w, "const (\n") for _, dr := range drs { fmt.Fprintf(w, "DiffServ%s = %#x", dr.Name, dr.Value) fmt.Fprintf(w, "// %s\n", dr.OrigName) } fmt.Fprintf(w, ")\n") return nil } type dscpRegistry struct { XMLName xml.Name `xml:"registry"` Title string `xml:"title"` Updated string `xml:"updated"` Note string `xml:"note"` RegTitle string `xml:"registry>title"` PoolRecords []struct { Name string `xml:"name"` Space string `xml:"space"` } `xml:"registry>record"` Records []struct { Name string `xml:"name"` Space string `xml:"space"` } `xml:"registry>registry>record"` } type canonDSCPRecord struct { OrigName string Name string Value int } func (drr *dscpRegistry) escape() []canonDSCPRecord { drs := make([]canonDSCPRecord, len(drr.Records)) sr := strings.NewReplacer( "+", "", "-", "", "/", "", ".", "", " ", "", ) for i, dr := range drr.Records { s := strings.TrimSpace(dr.Name) drs[i].OrigName = s drs[i].Name = sr.Replace(s) n, err := strconv.ParseUint(dr.Space, 2, 8) if err != nil { continue } drs[i].Value = int(n) << 2 } return drs } func parseTOSTCByte(w io.Writer, r io.Reader) error { dec := xml.NewDecoder(r) var ttb tosTCByte if err := dec.Decode(&ttb); err != nil { return err } trs := ttb.escape() fmt.Fprintf(w, "// %s, Updated: %s\n", ttb.Title, ttb.Updated) fmt.Fprintf(w, "const (\n") for _, tr := range trs { fmt.Fprintf(w, "%s = %#x", tr.Keyword, tr.Value) fmt.Fprintf(w, "// %s\n", tr.OrigKeyword) } fmt.Fprintf(w, ")\n") return nil } type tosTCByte struct { XMLName xml.Name `xml:"registry"` Title string `xml:"title"` Updated string `xml:"updated"` Note string `xml:"note"` RegTitle string `xml:"registry>title"` Records []struct { Binary string `xml:"binary"` Keyword string `xml:"keyword"` } `xml:"registry>record"` } type canonTOSTCByteRecord struct { OrigKeyword string Keyword string Value int } func (ttb *tosTCByte) escape() []canonTOSTCByteRecord { trs := make([]canonTOSTCByteRecord, len(ttb.Records)) sr := strings.NewReplacer( "Capable", "", "(", "", ")", "", "+", "", "-", "", "/", "", ".", "", " ", "", ) for i, tr := range ttb.Records { s := strings.TrimSpace(tr.Keyword) trs[i].OrigKeyword = s ss := strings.Split(s, " ") if len(ss) > 1 { trs[i].Keyword = strings.Join(ss[1:], " ") } else { trs[i].Keyword = ss[0] } trs[i].Keyword = sr.Replace(trs[i].Keyword) n, err := strconv.ParseUint(tr.Binary, 2, 8) if err != nil { continue } trs[i].Value = int(n) } return trs } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/payload_noncmsg.go����������������������������������������������������������������������0000644�0001751�0001751�00000002426�12235217213�015716� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build plan9 windows package ipv6 import ( "net" "syscall" ) // ReadFrom reads a payload of the received IPv6 datagram, from the // 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) { if !c.ok() { return 0, nil, nil, syscall.EINVAL } if n, src, err = c.PacketConn.ReadFrom(b); err != nil { return 0, nil, nil, err } return } // 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 // 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() { return 0, syscall.EINVAL } if dst == nil { return 0, errMissingAddress } return c.PacketConn.WriteTo(b, dst) } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/icmp_linux.go���������������������������������������������������������������������������0000644�0001751�0001751�00000001240�12235217213�014701� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ipv6 import "syscall" type rawICMPFilter struct { syscall.ICMPv6Filter } func (f *rawICMPFilter) set(typ ICMPType, block bool) { if block { f.Data[typ>>5] |= 1 << (uint32(typ) & 31) } else { f.Data[typ>>5] &^= 1 << (uint32(typ) & 31) } } func (f *rawICMPFilter) setAll(block bool) { for i := range f.Data { if block { f.Data[i] = 1<<32 - 1 } else { f.Data[i] = 0 } } } func (f *rawICMPFilter) willBlock(typ ICMPType) bool { return f.Data[typ>>5]&(1<<(uint32(typ)&31)) != 0 } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/dgramopt_posix.go�����������������������������������������������������������������������0000644�0001751�0001751�00000010252�12235217213�015574� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin freebsd linux netbsd openbsd windows package ipv6 import ( "net" "syscall" ) // MulticastHopLimit returns the hop limit field value for outgoing // multicast packets. func (c *dgramOpt) MulticastHopLimit() (int, error) { if !c.ok() { return 0, syscall.EINVAL } fd, err := c.sysfd() if err != nil { return 0, err } return ipv6MulticastHopLimit(fd) } // SetMulticastHopLimit sets the hop limit field value for future // outgoing multicast packets. func (c *dgramOpt) SetMulticastHopLimit(hoplim int) error { if !c.ok() { return syscall.EINVAL } fd, err := c.sysfd() if err != nil { return err } return setIPv6MulticastHopLimit(fd, hoplim) } // MulticastInterface returns the default interface for multicast // packet transmissions. func (c *dgramOpt) MulticastInterface() (*net.Interface, error) { if !c.ok() { return nil, syscall.EINVAL } fd, err := c.sysfd() if err != nil { return nil, err } return ipv6MulticastInterface(fd) } // SetMulticastInterface sets the default interface for future // multicast packet transmissions. func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error { if !c.ok() { return syscall.EINVAL } fd, err := c.sysfd() if err != nil { return err } return setIPv6MulticastInterface(fd, ifi) } // MulticastLoopback reports whether transmitted multicast packets // should be copied and send back to the originator. func (c *dgramOpt) MulticastLoopback() (bool, error) { if !c.ok() { return false, syscall.EINVAL } fd, err := c.sysfd() if err != nil { return false, err } return ipv6MulticastLoopback(fd) } // SetMulticastLoopback sets whether transmitted multicast packets // should be copied and send back to the originator. func (c *dgramOpt) SetMulticastLoopback(on bool) error { if !c.ok() { return syscall.EINVAL } fd, err := c.sysfd() if err != nil { return err } return setIPv6MulticastLoopback(fd, on) } // JoinGroup joins the group address group on the interface ifi. // It uses the system assigned multicast interface when ifi is nil, // although this is not recommended because the assignment depends on // platforms and sometimes it might require routing configuration. func (c *dgramOpt) JoinGroup(ifi *net.Interface, group net.Addr) error { if !c.ok() { return syscall.EINVAL } fd, err := c.sysfd() if err != nil { return err } grp := netAddrToIP16(group) if grp == nil { return errMissingAddress } return joinIPv6Group(fd, ifi, grp) } // LeaveGroup leaves the group address group on the interface ifi. func (c *dgramOpt) LeaveGroup(ifi *net.Interface, group net.Addr) error { if !c.ok() { return syscall.EINVAL } fd, err := c.sysfd() if err != nil { return err } grp := netAddrToIP16(group) if grp == nil { return errMissingAddress } return leaveIPv6Group(fd, ifi, grp) } // Checksum reports whether the kernel will compute, store or verify a // 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) { if !c.ok() { return false, 0, syscall.EINVAL } fd, err := c.sysfd() if err != nil { return false, 0, err } return ipv6Checksum(fd) } // 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 { if !c.ok() { return syscall.EINVAL } fd, err := c.sysfd() if err != nil { return err } return setIPv6Checksum(fd, on, offset) } // ICMPFilter returns an ICMP filter. func (c *dgramOpt) ICMPFilter() (*ICMPFilter, error) { if !c.ok() { return nil, syscall.EINVAL } fd, err := c.sysfd() if err != nil { return nil, err } return ipv6ICMPFilter(fd) } // SetICMPFilter deploys the ICMP filter. func (c *dgramOpt) SetICMPFilter(f *ICMPFilter) error { if !c.ok() { return syscall.EINVAL } fd, err := c.sysfd() if err != nil { return err } return setIPv6ICMPFilter(fd, f) } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/ipv6/sockopt_rfc3493_unix.go�����������������������������������������������������������������0000644�0001751�0001751�00000006277�12235217213�016453� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin freebsd linux netbsd openbsd package ipv6 import ( "net" "os" "syscall" ) func ipv6TrafficClass(fd int) (int, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_TCLASS) if err != nil { return 0, os.NewSyscallError("getsockopt", err) } return v, nil } func setIPv6TrafficClass(fd, v int) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_TCLASS, v)) } func ipv6HopLimit(fd int) (int, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_UNICAST_HOPS) if err != nil { return 0, os.NewSyscallError("getsockopt", err) } return v, nil } func setIPv6HopLimit(fd, v int) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_UNICAST_HOPS, v)) } func ipv6Checksum(fd int) (bool, int, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_CHECKSUM) if err != nil { return false, 0, os.NewSyscallError("getsockopt", err) } on := true if v == -1 { on = false } return on, v, nil } func ipv6MulticastHopLimit(fd int) (int, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_MULTICAST_HOPS) if err != nil { return 0, os.NewSyscallError("getsockopt", err) } return v, nil } func setIPv6MulticastHopLimit(fd, v int) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_MULTICAST_HOPS, v)) } func ipv6MulticastInterface(fd int) (*net.Interface, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_MULTICAST_IF) if err != nil { return nil, os.NewSyscallError("getsockopt", err) } if v == 0 { return nil, nil } ifi, err := net.InterfaceByIndex(v) if err != nil { return nil, err } return ifi, nil } func setIPv6MulticastInterface(fd int, ifi *net.Interface) error { var v int if ifi != nil { v = ifi.Index } return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_MULTICAST_IF, v)) } func ipv6MulticastLoopback(fd int) (bool, error) { v, err := syscall.GetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_MULTICAST_LOOP) if err != nil { return false, os.NewSyscallError("getsockopt", err) } return v == 1, nil } func setIPv6MulticastLoopback(fd int, v bool) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIPv6, syscall.IPV6_MULTICAST_LOOP, boolint(v))) } func joinIPv6Group(fd int, ifi *net.Interface, grp net.IP) error { mreq := syscall.IPv6Mreq{} copy(mreq.Multiaddr[:], grp) if ifi != nil { mreq.Interface = uint32(ifi.Index) } return os.NewSyscallError("setsockopt", syscall.SetsockoptIPv6Mreq(fd, ianaProtocolIPv6, syscall.IPV6_JOIN_GROUP, &mreq)) } func leaveIPv6Group(fd int, ifi *net.Interface, grp net.IP) error { mreq := syscall.IPv6Mreq{} copy(mreq.Multiaddr[:], grp) if ifi != nil { mreq.Interface = uint32(ifi.Index) } return os.NewSyscallError("setsockopt", syscall.SetsockoptIPv6Mreq(fd, ianaProtocolIPv6, syscall.IPV6_LEAVE_GROUP, &mreq)) } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/README���������������������������������������������������������������������������������������0000644�0001751�0001751�00000000217�12235217213�012202� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������This repository holds supplementary Go networking libraries. To submit changes to this repository, see http://golang.org/doc/contribute.html. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/spdy/����������������������������������������������������������������������������������������0000755�0001751�0001751�00000000000�12235217213�012301� 5����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/spdy/dictionary.go���������������������������������������������������������������������������0000644�0001751�0001751�00000021453�12235217213�015002� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package spdy // headerDictionary is the dictionary sent to the zlib compressor/decompressor. var headerDictionary = []byte{ 0x00, 0x00, 0x00, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x00, 0x00, 0x00, 0x04, 0x68, 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x00, 0x00, 0x00, 0x03, 0x70, 0x75, 0x74, 0x00, 0x00, 0x00, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x00, 0x00, 0x00, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00, 0x06, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x00, 0x00, 0x00, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x00, 0x00, 0x00, 0x0f, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x0f, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x00, 0x00, 0x00, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x00, 0x00, 0x00, 0x03, 0x61, 0x67, 0x65, 0x00, 0x00, 0x00, 0x05, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x00, 0x00, 0x00, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x00, 0x00, 0x00, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x62, 0x61, 0x73, 0x65, 0x00, 0x00, 0x00, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x00, 0x00, 0x00, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x00, 0x00, 0x00, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6d, 0x64, 0x35, 0x00, 0x00, 0x00, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x00, 0x00, 0x00, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x00, 0x00, 0x00, 0x04, 0x64, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x04, 0x65, 0x74, 0x61, 0x67, 0x00, 0x00, 0x00, 0x06, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x00, 0x00, 0x00, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x00, 0x00, 0x00, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x00, 0x00, 0x00, 0x08, 0x69, 0x66, 0x2d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x00, 0x00, 0x00, 0x11, 0x69, 0x66, 0x2d, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2d, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x00, 0x00, 0x00, 0x0d, 0x69, 0x66, 0x2d, 0x6e, 0x6f, 0x6e, 0x65, 0x2d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x00, 0x00, 0x00, 0x08, 0x69, 0x66, 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x00, 0x00, 0x00, 0x13, 0x69, 0x66, 0x2d, 0x75, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2d, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x00, 0x00, 0x00, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x00, 0x00, 0x00, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x0c, 0x6d, 0x61, 0x78, 0x2d, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x73, 0x00, 0x00, 0x00, 0x06, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x00, 0x00, 0x00, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x13, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x00, 0x00, 0x00, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72, 0x00, 0x00, 0x00, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x2d, 0x61, 0x66, 0x74, 0x65, 0x72, 0x00, 0x00, 0x00, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x00, 0x00, 0x00, 0x02, 0x74, 0x65, 0x00, 0x00, 0x00, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x00, 0x00, 0x00, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x07, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x00, 0x00, 0x00, 0x04, 0x76, 0x61, 0x72, 0x79, 0x00, 0x00, 0x00, 0x03, 0x76, 0x69, 0x61, 0x00, 0x00, 0x00, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x10, 0x77, 0x77, 0x77, 0x2d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00, 0x00, 0x03, 0x67, 0x65, 0x74, 0x00, 0x00, 0x00, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x00, 0x00, 0x00, 0x06, 0x32, 0x30, 0x30, 0x20, 0x4f, 0x4b, 0x00, 0x00, 0x00, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x08, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, 0x00, 0x00, 0x00, 0x03, 0x75, 0x72, 0x6c, 0x00, 0x00, 0x00, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x00, 0x00, 0x00, 0x0a, 0x73, 0x65, 0x74, 0x2d, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x00, 0x00, 0x00, 0x0a, 0x6b, 0x65, 0x65, 0x70, 0x2d, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x00, 0x00, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31, 0x32, 0x30, 0x31, 0x32, 0x30, 0x32, 0x32, 0x30, 0x35, 0x32, 0x30, 0x36, 0x33, 0x30, 0x30, 0x33, 0x30, 0x32, 0x33, 0x30, 0x33, 0x33, 0x30, 0x34, 0x33, 0x30, 0x35, 0x33, 0x30, 0x36, 0x33, 0x30, 0x37, 0x34, 0x30, 0x32, 0x34, 0x30, 0x35, 0x34, 0x30, 0x36, 0x34, 0x30, 0x37, 0x34, 0x30, 0x38, 0x34, 0x30, 0x39, 0x34, 0x31, 0x30, 0x34, 0x31, 0x31, 0x34, 0x31, 0x32, 0x34, 0x31, 0x33, 0x34, 0x31, 0x34, 0x34, 0x31, 0x35, 0x34, 0x31, 0x36, 0x34, 0x31, 0x37, 0x35, 0x30, 0x32, 0x35, 0x30, 0x34, 0x35, 0x30, 0x35, 0x32, 0x30, 0x33, 0x20, 0x4e, 0x6f, 0x6e, 0x2d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x32, 0x30, 0x34, 0x20, 0x4e, 0x6f, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x33, 0x30, 0x31, 0x20, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x34, 0x30, 0x30, 0x20, 0x42, 0x61, 0x64, 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x34, 0x30, 0x31, 0x20, 0x55, 0x6e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x34, 0x30, 0x33, 0x20, 0x46, 0x6f, 0x72, 0x62, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x34, 0x30, 0x34, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x35, 0x30, 0x30, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x35, 0x30, 0x31, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x35, 0x30, 0x33, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4a, 0x61, 0x6e, 0x20, 0x46, 0x65, 0x62, 0x20, 0x4d, 0x61, 0x72, 0x20, 0x41, 0x70, 0x72, 0x20, 0x4d, 0x61, 0x79, 0x20, 0x4a, 0x75, 0x6e, 0x20, 0x4a, 0x75, 0x6c, 0x20, 0x41, 0x75, 0x67, 0x20, 0x53, 0x65, 0x70, 0x74, 0x20, 0x4f, 0x63, 0x74, 0x20, 0x4e, 0x6f, 0x76, 0x20, 0x44, 0x65, 0x63, 0x20, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x20, 0x4d, 0x6f, 0x6e, 0x2c, 0x20, 0x54, 0x75, 0x65, 0x2c, 0x20, 0x57, 0x65, 0x64, 0x2c, 0x20, 0x54, 0x68, 0x75, 0x2c, 0x20, 0x46, 0x72, 0x69, 0x2c, 0x20, 0x53, 0x61, 0x74, 0x2c, 0x20, 0x53, 0x75, 0x6e, 0x2c, 0x20, 0x47, 0x4d, 0x54, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x65, 0x64, 0x2c, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x2c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0x2c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x70, 0x67, 0x2c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x6d, 0x6c, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x68, 0x74, 0x6d, 0x6c, 0x2b, 0x78, 0x6d, 0x6c, 0x2c, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x2c, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x78, 0x2d, 0x61, 0x67, 0x65, 0x3d, 0x67, 0x7a, 0x69, 0x70, 0x2c, 0x64, 0x65, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x73, 0x64, 0x63, 0x68, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x69, 0x73, 0x6f, 0x2d, 0x38, 0x38, 0x35, 0x39, 0x2d, 0x31, 0x2c, 0x75, 0x74, 0x66, 0x2d, 0x2c, 0x2a, 0x2c, 0x65, 0x6e, 0x71, 0x3d, 0x30, 0x2e, } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/spdy/spdy_test.go����������������������������������������������������������������������������0000644�0001751�0001751�00000041562�12235217213�014656� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package spdy import ( "bytes" "compress/zlib" "encoding/base64" "io" "io/ioutil" "net/http" "reflect" "testing" ) var HeadersFixture = http.Header{ "Url": []string{"http://www.google.com/"}, "Method": []string{"get"}, "Version": []string{"http/1.1"}, } func TestHeaderParsing(t *testing.T) { var headerValueBlockBuf bytes.Buffer writeHeaderValueBlock(&headerValueBlockBuf, HeadersFixture) const bogusStreamId = 1 newHeaders, err := parseHeaderValueBlock(&headerValueBlockBuf, bogusStreamId) if err != nil { t.Fatal("parseHeaderValueBlock:", err) } if !reflect.DeepEqual(HeadersFixture, newHeaders) { t.Fatal("got: ", newHeaders, "\nwant: ", HeadersFixture) } } func TestCreateParseSynStreamFrameCompressionDisable(t *testing.T) { buffer := new(bytes.Buffer) // Fixture framer for no compression test. framer := &Framer{ headerCompressionDisabled: true, w: buffer, headerBuf: new(bytes.Buffer), r: buffer, } synStreamFrame := SynStreamFrame{ CFHeader: ControlFrameHeader{ version: Version, frameType: TypeSynStream, }, StreamId: 2, Headers: HeadersFixture, } if err := framer.WriteFrame(&synStreamFrame); err != nil { t.Fatal("WriteFrame without compression:", err) } frame, err := framer.ReadFrame() if err != nil { t.Fatal("ReadFrame without compression:", err) } parsedSynStreamFrame, ok := frame.(*SynStreamFrame) if !ok { t.Fatal("Parsed incorrect frame type:", frame) } if !reflect.DeepEqual(synStreamFrame, *parsedSynStreamFrame) { t.Fatal("got: ", *parsedSynStreamFrame, "\nwant: ", synStreamFrame) } } func TestCreateParseSynStreamFrameCompressionEnable(t *testing.T) { buffer := new(bytes.Buffer) framer, err := NewFramer(buffer, buffer) synStreamFrame := SynStreamFrame{ CFHeader: ControlFrameHeader{ version: Version, frameType: TypeSynStream, }, StreamId: 2, Headers: HeadersFixture, } if err != nil { t.Fatal("Failed to create new framer:", err) } if err := framer.WriteFrame(&synStreamFrame); err != nil { t.Fatal("WriteFrame with compression:", err) } frame, err := framer.ReadFrame() if err != nil { t.Fatal("ReadFrame with compression:", err) } parsedSynStreamFrame, ok := frame.(*SynStreamFrame) if !ok { t.Fatal("Parsed incorrect frame type:", frame) } if !reflect.DeepEqual(synStreamFrame, *parsedSynStreamFrame) { t.Fatal("got: ", *parsedSynStreamFrame, "\nwant: ", synStreamFrame) } } func TestCreateParseSynReplyFrameCompressionDisable(t *testing.T) { buffer := new(bytes.Buffer) framer := &Framer{ headerCompressionDisabled: true, w: buffer, headerBuf: new(bytes.Buffer), r: buffer, } synReplyFrame := SynReplyFrame{ CFHeader: ControlFrameHeader{ version: Version, frameType: TypeSynReply, }, StreamId: 2, Headers: HeadersFixture, } if err := framer.WriteFrame(&synReplyFrame); err != nil { t.Fatal("WriteFrame without compression:", err) } frame, err := framer.ReadFrame() if err != nil { t.Fatal("ReadFrame without compression:", err) } parsedSynReplyFrame, ok := frame.(*SynReplyFrame) if !ok { t.Fatal("Parsed incorrect frame type:", frame) } if !reflect.DeepEqual(synReplyFrame, *parsedSynReplyFrame) { t.Fatal("got: ", *parsedSynReplyFrame, "\nwant: ", synReplyFrame) } } func TestCreateParseSynReplyFrameCompressionEnable(t *testing.T) { buffer := new(bytes.Buffer) framer, err := NewFramer(buffer, buffer) synReplyFrame := SynReplyFrame{ CFHeader: ControlFrameHeader{ version: Version, frameType: TypeSynReply, }, StreamId: 2, Headers: HeadersFixture, } if err != nil { t.Fatal("Failed to create new framer:", err) } if err := framer.WriteFrame(&synReplyFrame); err != nil { t.Fatal("WriteFrame with compression:", err) } frame, err := framer.ReadFrame() if err != nil { t.Fatal("ReadFrame with compression:", err) } parsedSynReplyFrame, ok := frame.(*SynReplyFrame) if !ok { t.Fatal("Parsed incorrect frame type:", frame) } if !reflect.DeepEqual(synReplyFrame, *parsedSynReplyFrame) { t.Fatal("got: ", *parsedSynReplyFrame, "\nwant: ", synReplyFrame) } } func TestCreateParseRstStream(t *testing.T) { buffer := new(bytes.Buffer) framer, err := NewFramer(buffer, buffer) if err != nil { t.Fatal("Failed to create new framer:", err) } rstStreamFrame := RstStreamFrame{ CFHeader: ControlFrameHeader{ version: Version, frameType: TypeRstStream, }, StreamId: 1, Status: InvalidStream, } if err := framer.WriteFrame(&rstStreamFrame); err != nil { t.Fatal("WriteFrame:", err) } frame, err := framer.ReadFrame() if err != nil { t.Fatal("ReadFrame:", err) } parsedRstStreamFrame, ok := frame.(*RstStreamFrame) if !ok { t.Fatal("Parsed incorrect frame type:", frame) } if !reflect.DeepEqual(rstStreamFrame, *parsedRstStreamFrame) { t.Fatal("got: ", *parsedRstStreamFrame, "\nwant: ", rstStreamFrame) } } func TestCreateParseSettings(t *testing.T) { buffer := new(bytes.Buffer) framer, err := NewFramer(buffer, buffer) if err != nil { t.Fatal("Failed to create new framer:", err) } settingsFrame := SettingsFrame{ CFHeader: ControlFrameHeader{ version: Version, frameType: TypeSettings, }, FlagIdValues: []SettingsFlagIdValue{ {FlagSettingsPersistValue, SettingsCurrentCwnd, 10}, {FlagSettingsPersisted, SettingsUploadBandwidth, 1}, }, } if err := framer.WriteFrame(&settingsFrame); err != nil { t.Fatal("WriteFrame:", err) } frame, err := framer.ReadFrame() if err != nil { t.Fatal("ReadFrame:", err) } parsedSettingsFrame, ok := frame.(*SettingsFrame) if !ok { t.Fatal("Parsed incorrect frame type:", frame) } if !reflect.DeepEqual(settingsFrame, *parsedSettingsFrame) { t.Fatal("got: ", *parsedSettingsFrame, "\nwant: ", settingsFrame) } } func TestCreateParsePing(t *testing.T) { buffer := new(bytes.Buffer) framer, err := NewFramer(buffer, buffer) if err != nil { t.Fatal("Failed to create new framer:", err) } pingFrame := PingFrame{ CFHeader: ControlFrameHeader{ version: Version, frameType: TypePing, }, Id: 31337, } if err := framer.WriteFrame(&pingFrame); err != nil { t.Fatal("WriteFrame:", err) } if pingFrame.CFHeader.Flags != 0 { t.Fatal("Incorrect frame type:", pingFrame) } frame, err := framer.ReadFrame() if err != nil { t.Fatal("ReadFrame:", err) } parsedPingFrame, ok := frame.(*PingFrame) if !ok { t.Fatal("Parsed incorrect frame type:", frame) } if parsedPingFrame.CFHeader.Flags != 0 { t.Fatal("Parsed incorrect frame type:", parsedPingFrame) } if !reflect.DeepEqual(pingFrame, *parsedPingFrame) { t.Fatal("got: ", *parsedPingFrame, "\nwant: ", pingFrame) } } func TestCreateParseGoAway(t *testing.T) { buffer := new(bytes.Buffer) framer, err := NewFramer(buffer, buffer) if err != nil { t.Fatal("Failed to create new framer:", err) } goAwayFrame := GoAwayFrame{ CFHeader: ControlFrameHeader{ version: Version, frameType: TypeGoAway, }, LastGoodStreamId: 31337, Status: 1, } if err := framer.WriteFrame(&goAwayFrame); err != nil { t.Fatal("WriteFrame:", err) } if goAwayFrame.CFHeader.Flags != 0 { t.Fatal("Incorrect frame type:", goAwayFrame) } if goAwayFrame.CFHeader.length != 8 { t.Fatal("Incorrect frame type:", goAwayFrame) } frame, err := framer.ReadFrame() if err != nil { t.Fatal("ReadFrame:", err) } parsedGoAwayFrame, ok := frame.(*GoAwayFrame) if !ok { t.Fatal("Parsed incorrect frame type:", frame) } if parsedGoAwayFrame.CFHeader.Flags != 0 { t.Fatal("Incorrect frame type:", parsedGoAwayFrame) } if parsedGoAwayFrame.CFHeader.length != 8 { t.Fatal("Incorrect frame type:", parsedGoAwayFrame) } if !reflect.DeepEqual(goAwayFrame, *parsedGoAwayFrame) { t.Fatal("got: ", *parsedGoAwayFrame, "\nwant: ", goAwayFrame) } } func TestCreateParseHeadersFrame(t *testing.T) { buffer := new(bytes.Buffer) framer := &Framer{ headerCompressionDisabled: true, w: buffer, headerBuf: new(bytes.Buffer), r: buffer, } headersFrame := HeadersFrame{ CFHeader: ControlFrameHeader{ version: Version, frameType: TypeHeaders, }, StreamId: 2, } headersFrame.Headers = HeadersFixture if err := framer.WriteFrame(&headersFrame); err != nil { t.Fatal("WriteFrame without compression:", err) } frame, err := framer.ReadFrame() if err != nil { t.Fatal("ReadFrame without compression:", err) } parsedHeadersFrame, ok := frame.(*HeadersFrame) if !ok { t.Fatal("Parsed incorrect frame type:", frame) } if !reflect.DeepEqual(headersFrame, *parsedHeadersFrame) { t.Fatal("got: ", *parsedHeadersFrame, "\nwant: ", headersFrame) } } func TestCreateParseHeadersFrameCompressionEnable(t *testing.T) { buffer := new(bytes.Buffer) headersFrame := HeadersFrame{ CFHeader: ControlFrameHeader{ version: Version, frameType: TypeHeaders, }, StreamId: 2, } headersFrame.Headers = HeadersFixture framer, err := NewFramer(buffer, buffer) if err := framer.WriteFrame(&headersFrame); err != nil { t.Fatal("WriteFrame with compression:", err) } frame, err := framer.ReadFrame() if err != nil { t.Fatal("ReadFrame with compression:", err) } parsedHeadersFrame, ok := frame.(*HeadersFrame) if !ok { t.Fatal("Parsed incorrect frame type:", frame) } if !reflect.DeepEqual(headersFrame, *parsedHeadersFrame) { t.Fatal("got: ", *parsedHeadersFrame, "\nwant: ", headersFrame) } } func TestCreateParseWindowUpdateFrame(t *testing.T) { buffer := new(bytes.Buffer) framer, err := NewFramer(buffer, buffer) if err != nil { t.Fatal("Failed to create new framer:", err) } windowUpdateFrame := WindowUpdateFrame{ CFHeader: ControlFrameHeader{ version: Version, frameType: TypeWindowUpdate, }, StreamId: 31337, DeltaWindowSize: 1, } if err := framer.WriteFrame(&windowUpdateFrame); err != nil { t.Fatal("WriteFrame:", err) } if windowUpdateFrame.CFHeader.Flags != 0 { t.Fatal("Incorrect frame type:", windowUpdateFrame) } if windowUpdateFrame.CFHeader.length != 8 { t.Fatal("Incorrect frame type:", windowUpdateFrame) } frame, err := framer.ReadFrame() if err != nil { t.Fatal("ReadFrame:", err) } parsedWindowUpdateFrame, ok := frame.(*WindowUpdateFrame) if !ok { t.Fatal("Parsed incorrect frame type:", frame) } if parsedWindowUpdateFrame.CFHeader.Flags != 0 { t.Fatal("Incorrect frame type:", parsedWindowUpdateFrame) } if parsedWindowUpdateFrame.CFHeader.length != 8 { t.Fatal("Incorrect frame type:", parsedWindowUpdateFrame) } if !reflect.DeepEqual(windowUpdateFrame, *parsedWindowUpdateFrame) { t.Fatal("got: ", *parsedWindowUpdateFrame, "\nwant: ", windowUpdateFrame) } } func TestCreateParseDataFrame(t *testing.T) { buffer := new(bytes.Buffer) framer, err := NewFramer(buffer, buffer) if err != nil { t.Fatal("Failed to create new framer:", err) } dataFrame := DataFrame{ StreamId: 1, Data: []byte{'h', 'e', 'l', 'l', 'o'}, } if err := framer.WriteFrame(&dataFrame); err != nil { t.Fatal("WriteFrame:", err) } frame, err := framer.ReadFrame() if err != nil { t.Fatal("ReadFrame:", err) } parsedDataFrame, ok := frame.(*DataFrame) if !ok { t.Fatal("Parsed incorrect frame type:", frame) } if !reflect.DeepEqual(dataFrame, *parsedDataFrame) { t.Fatal("got: ", *parsedDataFrame, "\nwant: ", dataFrame) } } func TestCompressionContextAcrossFrames(t *testing.T) { buffer := new(bytes.Buffer) framer, err := NewFramer(buffer, buffer) if err != nil { t.Fatal("Failed to create new framer:", err) } headersFrame := HeadersFrame{ CFHeader: ControlFrameHeader{ version: Version, frameType: TypeHeaders, }, StreamId: 2, Headers: HeadersFixture, } if err := framer.WriteFrame(&headersFrame); err != nil { t.Fatal("WriteFrame (HEADERS):", err) } synStreamFrame := SynStreamFrame{ ControlFrameHeader{ Version, TypeSynStream, 0, // Flags 0, // length }, 2, // StreamId 0, // AssociatedTOStreamID 0, // Priority 1, // Slot nil, // Headers } synStreamFrame.Headers = HeadersFixture if err := framer.WriteFrame(&synStreamFrame); err != nil { t.Fatal("WriteFrame (SYN_STREAM):", err) } frame, err := framer.ReadFrame() if err != nil { t.Fatal("ReadFrame (HEADERS):", err, buffer.Bytes()) } parsedHeadersFrame, ok := frame.(*HeadersFrame) if !ok { t.Fatalf("expected HeadersFrame; got %T %v", frame, frame) } if !reflect.DeepEqual(headersFrame, *parsedHeadersFrame) { t.Fatal("got: ", *parsedHeadersFrame, "\nwant: ", headersFrame) } frame, err = framer.ReadFrame() if err != nil { t.Fatal("ReadFrame (SYN_STREAM):", err, buffer.Bytes()) } parsedSynStreamFrame, ok := frame.(*SynStreamFrame) if !ok { t.Fatalf("expected SynStreamFrame; got %T %v", frame, frame) } if !reflect.DeepEqual(synStreamFrame, *parsedSynStreamFrame) { t.Fatal("got: ", *parsedSynStreamFrame, "\nwant: ", synStreamFrame) } } func TestMultipleSPDYFrames(t *testing.T) { // Initialize the framers. pr1, pw1 := io.Pipe() pr2, pw2 := io.Pipe() writer, err := NewFramer(pw1, pr2) if err != nil { t.Fatal("Failed to create writer:", err) } reader, err := NewFramer(pw2, pr1) if err != nil { t.Fatal("Failed to create reader:", err) } // Set up the frames we're actually transferring. headersFrame := HeadersFrame{ CFHeader: ControlFrameHeader{ version: Version, frameType: TypeHeaders, }, StreamId: 2, Headers: HeadersFixture, } synStreamFrame := SynStreamFrame{ CFHeader: ControlFrameHeader{ version: Version, frameType: TypeSynStream, }, StreamId: 2, Headers: HeadersFixture, } // Start the goroutines to write the frames. go func() { if err := writer.WriteFrame(&headersFrame); err != nil { t.Fatal("WriteFrame (HEADERS): ", err) } if err := writer.WriteFrame(&synStreamFrame); err != nil { t.Fatal("WriteFrame (SYN_STREAM): ", err) } }() // Read the frames and verify they look as expected. frame, err := reader.ReadFrame() if err != nil { t.Fatal("ReadFrame (HEADERS): ", err) } parsedHeadersFrame, ok := frame.(*HeadersFrame) if !ok { t.Fatal("Parsed incorrect frame type:", frame) } if !reflect.DeepEqual(headersFrame, *parsedHeadersFrame) { t.Fatal("got: ", *parsedHeadersFrame, "\nwant: ", headersFrame) } frame, err = reader.ReadFrame() if err != nil { t.Fatal("ReadFrame (SYN_STREAM):", err) } parsedSynStreamFrame, ok := frame.(*SynStreamFrame) if !ok { t.Fatal("Parsed incorrect frame type.") } if !reflect.DeepEqual(synStreamFrame, *parsedSynStreamFrame) { t.Fatal("got: ", *parsedSynStreamFrame, "\nwant: ", synStreamFrame) } } func TestReadMalformedZlibHeader(t *testing.T) { // These were constructed by corrupting the first byte of the zlib // header after writing. malformedStructs := map[string]string{ "SynStreamFrame": "gAIAAQAAABgAAAACAAAAAAAAF/nfolGyYmAAAAAA//8=", "SynReplyFrame": "gAIAAgAAABQAAAACAAAX+d+iUbJiYAAAAAD//w==", "HeadersFrame": "gAIACAAAABQAAAACAAAX+d+iUbJiYAAAAAD//w==", } for name, bad := range malformedStructs { b, err := base64.StdEncoding.DecodeString(bad) if err != nil { t.Errorf("Unable to decode base64 encoded frame %s: %v", name, err) } buf := bytes.NewBuffer(b) reader, err := NewFramer(buf, buf) if err != nil { t.Fatalf("NewFramer: %v", err) } _, err = reader.ReadFrame() if err != zlib.ErrHeader { t.Errorf("Frame %s, expected: %#v, actual: %#v", name, zlib.ErrHeader, err) } } } // TODO: these tests are too weak for updating SPDY spec. Fix me. type zeroStream struct { frame Frame encoded string } var streamIdZeroFrames = map[string]zeroStream{ "SynStreamFrame": { &SynStreamFrame{StreamId: 0}, "gAIAAQAAABgAAAAAAAAAAAAAePnfolGyYmAAAAAA//8=", }, "SynReplyFrame": { &SynReplyFrame{StreamId: 0}, "gAIAAgAAABQAAAAAAAB4+d+iUbJiYAAAAAD//w==", }, "RstStreamFrame": { &RstStreamFrame{StreamId: 0}, "gAIAAwAAAAgAAAAAAAAAAA==", }, "HeadersFrame": { &HeadersFrame{StreamId: 0}, "gAIACAAAABQAAAAAAAB4+d+iUbJiYAAAAAD//w==", }, "DataFrame": { &DataFrame{StreamId: 0}, "AAAAAAAAAAA=", }, "PingFrame": { &PingFrame{Id: 0}, "gAIABgAAAAQAAAAA", }, } func TestNoZeroStreamId(t *testing.T) { t.Log("skipping") // TODO: update to work with SPDY3 return for name, f := range streamIdZeroFrames { b, err := base64.StdEncoding.DecodeString(f.encoded) if err != nil { t.Errorf("Unable to decode base64 encoded frame %s: %v", f, err) continue } framer, err := NewFramer(ioutil.Discard, bytes.NewReader(b)) if err != nil { t.Fatalf("NewFramer: %v", err) } err = framer.WriteFrame(f.frame) checkZeroStreamId(t, name, "WriteFrame", err) _, err = framer.ReadFrame() checkZeroStreamId(t, name, "ReadFrame", err) } } func checkZeroStreamId(t *testing.T, frame string, method string, err error) { if err == nil { t.Errorf("%s ZeroStreamId, no error on %s", method, frame) return } eerr, ok := err.(*Error) if !ok || eerr.Err != ZeroStreamId { t.Errorf("%s ZeroStreamId, incorrect error %#v, frame %s", method, eerr, frame) } } ����������������������������������������������������������������������������������������������������������������������������������������������go.net/spdy/read.go���������������������������������������������������������������������������������0000644�0001751�0001751�00000023101�12235217213�013540� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package spdy import ( "compress/zlib" "encoding/binary" "io" "net/http" "strings" ) func (frame *SynStreamFrame) read(h ControlFrameHeader, f *Framer) error { return f.readSynStreamFrame(h, frame) } func (frame *SynReplyFrame) read(h ControlFrameHeader, f *Framer) error { return f.readSynReplyFrame(h, frame) } func (frame *RstStreamFrame) read(h ControlFrameHeader, f *Framer) error { frame.CFHeader = h if err := binary.Read(f.r, binary.BigEndian, &frame.StreamId); err != nil { return err } if err := binary.Read(f.r, binary.BigEndian, &frame.Status); err != nil { return err } if frame.Status == 0 { return &Error{InvalidControlFrame, frame.StreamId} } if frame.StreamId == 0 { return &Error{ZeroStreamId, 0} } return nil } func (frame *SettingsFrame) read(h ControlFrameHeader, f *Framer) error { frame.CFHeader = h var numSettings uint32 if err := binary.Read(f.r, binary.BigEndian, &numSettings); err != nil { return err } frame.FlagIdValues = make([]SettingsFlagIdValue, numSettings) for i := uint32(0); i < numSettings; i++ { if err := binary.Read(f.r, binary.BigEndian, &frame.FlagIdValues[i].Id); err != nil { return err } frame.FlagIdValues[i].Flag = SettingsFlag((frame.FlagIdValues[i].Id & 0xff000000) >> 24) frame.FlagIdValues[i].Id &= 0xffffff if err := binary.Read(f.r, binary.BigEndian, &frame.FlagIdValues[i].Value); err != nil { return err } } return nil } func (frame *PingFrame) read(h ControlFrameHeader, f *Framer) error { frame.CFHeader = h if err := binary.Read(f.r, binary.BigEndian, &frame.Id); err != nil { return err } if frame.Id == 0 { return &Error{ZeroStreamId, 0} } if frame.CFHeader.Flags != 0 { return &Error{InvalidControlFrame, StreamId(frame.Id)} } return nil } func (frame *GoAwayFrame) read(h ControlFrameHeader, f *Framer) error { frame.CFHeader = h if err := binary.Read(f.r, binary.BigEndian, &frame.LastGoodStreamId); err != nil { return err } if frame.CFHeader.Flags != 0 { return &Error{InvalidControlFrame, frame.LastGoodStreamId} } if frame.CFHeader.length != 8 { return &Error{InvalidControlFrame, frame.LastGoodStreamId} } if err := binary.Read(f.r, binary.BigEndian, &frame.Status); err != nil { return err } return nil } func (frame *HeadersFrame) read(h ControlFrameHeader, f *Framer) error { return f.readHeadersFrame(h, frame) } func (frame *WindowUpdateFrame) read(h ControlFrameHeader, f *Framer) error { frame.CFHeader = h if err := binary.Read(f.r, binary.BigEndian, &frame.StreamId); err != nil { return err } if frame.CFHeader.Flags != 0 { return &Error{InvalidControlFrame, frame.StreamId} } if frame.CFHeader.length != 8 { return &Error{InvalidControlFrame, frame.StreamId} } if err := binary.Read(f.r, binary.BigEndian, &frame.DeltaWindowSize); err != nil { return err } return nil } func newControlFrame(frameType ControlFrameType) (controlFrame, error) { ctor, ok := cframeCtor[frameType] if !ok { return nil, &Error{Err: InvalidControlFrame} } return ctor(), nil } var cframeCtor = map[ControlFrameType]func() controlFrame{ TypeSynStream: func() controlFrame { return new(SynStreamFrame) }, TypeSynReply: func() controlFrame { return new(SynReplyFrame) }, TypeRstStream: func() controlFrame { return new(RstStreamFrame) }, TypeSettings: func() controlFrame { return new(SettingsFrame) }, TypePing: func() controlFrame { return new(PingFrame) }, TypeGoAway: func() controlFrame { return new(GoAwayFrame) }, TypeHeaders: func() controlFrame { return new(HeadersFrame) }, TypeWindowUpdate: func() controlFrame { return new(WindowUpdateFrame) }, } func (f *Framer) uncorkHeaderDecompressor(payloadSize int64) error { if f.headerDecompressor != nil { f.headerReader.N = payloadSize return nil } f.headerReader = io.LimitedReader{R: f.r, N: payloadSize} decompressor, err := zlib.NewReaderDict(&f.headerReader, []byte(headerDictionary)) if err != nil { return err } f.headerDecompressor = decompressor return nil } // ReadFrame reads SPDY encoded data and returns a decompressed Frame. func (f *Framer) ReadFrame() (Frame, error) { var firstWord uint32 if err := binary.Read(f.r, binary.BigEndian, &firstWord); err != nil { return nil, err } if firstWord&0x80000000 != 0 { frameType := ControlFrameType(firstWord & 0xffff) version := uint16(firstWord >> 16 & 0x7fff) return f.parseControlFrame(version, frameType) } return f.parseDataFrame(StreamId(firstWord & 0x7fffffff)) } func (f *Framer) parseControlFrame(version uint16, frameType ControlFrameType) (Frame, error) { var length uint32 if err := binary.Read(f.r, binary.BigEndian, &length); err != nil { return nil, err } flags := ControlFlags((length & 0xff000000) >> 24) length &= 0xffffff header := ControlFrameHeader{version, frameType, flags, length} cframe, err := newControlFrame(frameType) if err != nil { return nil, err } if err = cframe.read(header, f); err != nil { return nil, err } return cframe, nil } func parseHeaderValueBlock(r io.Reader, streamId StreamId) (http.Header, error) { var numHeaders uint32 if err := binary.Read(r, binary.BigEndian, &numHeaders); err != nil { return nil, err } var e error h := make(http.Header, int(numHeaders)) for i := 0; i < int(numHeaders); i++ { var length uint32 if err := binary.Read(r, binary.BigEndian, &length); err != nil { return nil, err } nameBytes := make([]byte, length) if _, err := io.ReadFull(r, nameBytes); err != nil { return nil, err } name := string(nameBytes) if name != strings.ToLower(name) { e = &Error{UnlowercasedHeaderName, streamId} name = strings.ToLower(name) } if h[name] != nil { e = &Error{DuplicateHeaders, streamId} } if err := binary.Read(r, binary.BigEndian, &length); err != nil { return nil, err } value := make([]byte, length) if _, err := io.ReadFull(r, value); err != nil { return nil, err } valueList := strings.Split(string(value), headerValueSeparator) for _, v := range valueList { h.Add(name, v) } } if e != nil { return h, e } return h, nil } func (f *Framer) readSynStreamFrame(h ControlFrameHeader, frame *SynStreamFrame) error { frame.CFHeader = h var err error if err = binary.Read(f.r, binary.BigEndian, &frame.StreamId); err != nil { return err } if err = binary.Read(f.r, binary.BigEndian, &frame.AssociatedToStreamId); err != nil { return err } if err = binary.Read(f.r, binary.BigEndian, &frame.Priority); err != nil { return err } frame.Priority >>= 5 if err = binary.Read(f.r, binary.BigEndian, &frame.Slot); err != nil { return err } reader := f.r if !f.headerCompressionDisabled { err := f.uncorkHeaderDecompressor(int64(h.length - 10)) if err != nil { return err } reader = f.headerDecompressor } frame.Headers, err = parseHeaderValueBlock(reader, frame.StreamId) if !f.headerCompressionDisabled && (err == io.EOF && f.headerReader.N == 0 || f.headerReader.N != 0) { err = &Error{WrongCompressedPayloadSize, 0} } if err != nil { return err } for h := range frame.Headers { if invalidReqHeaders[h] { return &Error{InvalidHeaderPresent, frame.StreamId} } } if frame.StreamId == 0 { return &Error{ZeroStreamId, 0} } return nil } func (f *Framer) readSynReplyFrame(h ControlFrameHeader, frame *SynReplyFrame) error { frame.CFHeader = h var err error if err = binary.Read(f.r, binary.BigEndian, &frame.StreamId); err != nil { return err } reader := f.r if !f.headerCompressionDisabled { err := f.uncorkHeaderDecompressor(int64(h.length - 4)) if err != nil { return err } reader = f.headerDecompressor } frame.Headers, err = parseHeaderValueBlock(reader, frame.StreamId) if !f.headerCompressionDisabled && (err == io.EOF && f.headerReader.N == 0 || f.headerReader.N != 0) { err = &Error{WrongCompressedPayloadSize, 0} } if err != nil { return err } for h := range frame.Headers { if invalidRespHeaders[h] { return &Error{InvalidHeaderPresent, frame.StreamId} } } if frame.StreamId == 0 { return &Error{ZeroStreamId, 0} } return nil } func (f *Framer) readHeadersFrame(h ControlFrameHeader, frame *HeadersFrame) error { frame.CFHeader = h var err error if err = binary.Read(f.r, binary.BigEndian, &frame.StreamId); err != nil { return err } reader := f.r if !f.headerCompressionDisabled { err := f.uncorkHeaderDecompressor(int64(h.length - 4)) if err != nil { return err } reader = f.headerDecompressor } frame.Headers, err = parseHeaderValueBlock(reader, frame.StreamId) if !f.headerCompressionDisabled && (err == io.EOF && f.headerReader.N == 0 || f.headerReader.N != 0) { err = &Error{WrongCompressedPayloadSize, 0} } if err != nil { return err } var invalidHeaders map[string]bool if frame.StreamId%2 == 0 { invalidHeaders = invalidReqHeaders } else { invalidHeaders = invalidRespHeaders } for h := range frame.Headers { if invalidHeaders[h] { return &Error{InvalidHeaderPresent, frame.StreamId} } } if frame.StreamId == 0 { return &Error{ZeroStreamId, 0} } return nil } func (f *Framer) parseDataFrame(streamId StreamId) (*DataFrame, error) { var length uint32 if err := binary.Read(f.r, binary.BigEndian, &length); err != nil { return nil, err } var frame DataFrame frame.StreamId = streamId frame.Flags = DataFlags(length >> 24) length &= 0xffffff frame.Data = make([]byte, length) if _, err := io.ReadFull(f.r, frame.Data); err != nil { return nil, err } if frame.StreamId == 0 { return nil, &Error{ZeroStreamId, 0} } return &frame, nil } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/spdy/write.go��������������������������������������������������������������������������������0000644�0001751�0001751�00000017665�12235217213�014001� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package spdy import ( "encoding/binary" "io" "net/http" "strings" ) func (frame *SynStreamFrame) write(f *Framer) error { return f.writeSynStreamFrame(frame) } func (frame *SynReplyFrame) write(f *Framer) error { return f.writeSynReplyFrame(frame) } func (frame *RstStreamFrame) write(f *Framer) (err error) { if frame.StreamId == 0 { return &Error{ZeroStreamId, 0} } frame.CFHeader.version = Version frame.CFHeader.frameType = TypeRstStream frame.CFHeader.Flags = 0 frame.CFHeader.length = 8 // Serialize frame to Writer. if err = writeControlFrameHeader(f.w, frame.CFHeader); err != nil { return } if err = binary.Write(f.w, binary.BigEndian, frame.StreamId); err != nil { return } if frame.Status == 0 { return &Error{InvalidControlFrame, frame.StreamId} } if err = binary.Write(f.w, binary.BigEndian, frame.Status); err != nil { return } return } func (frame *SettingsFrame) write(f *Framer) (err error) { frame.CFHeader.version = Version frame.CFHeader.frameType = TypeSettings frame.CFHeader.length = uint32(len(frame.FlagIdValues)*8 + 4) // Serialize frame to Writer. if err = writeControlFrameHeader(f.w, frame.CFHeader); err != nil { return } if err = binary.Write(f.w, binary.BigEndian, uint32(len(frame.FlagIdValues))); err != nil { return } for _, flagIdValue := range frame.FlagIdValues { flagId := uint32(flagIdValue.Flag)<<24 | uint32(flagIdValue.Id) if err = binary.Write(f.w, binary.BigEndian, flagId); err != nil { return } if err = binary.Write(f.w, binary.BigEndian, flagIdValue.Value); err != nil { return } } return } func (frame *PingFrame) write(f *Framer) (err error) { if frame.Id == 0 { return &Error{ZeroStreamId, 0} } frame.CFHeader.version = Version frame.CFHeader.frameType = TypePing frame.CFHeader.Flags = 0 frame.CFHeader.length = 4 // Serialize frame to Writer. if err = writeControlFrameHeader(f.w, frame.CFHeader); err != nil { return } if err = binary.Write(f.w, binary.BigEndian, frame.Id); err != nil { return } return } func (frame *GoAwayFrame) write(f *Framer) (err error) { frame.CFHeader.version = Version frame.CFHeader.frameType = TypeGoAway frame.CFHeader.Flags = 0 frame.CFHeader.length = 8 // Serialize frame to Writer. if err = writeControlFrameHeader(f.w, frame.CFHeader); err != nil { return } if err = binary.Write(f.w, binary.BigEndian, frame.LastGoodStreamId); err != nil { return } if err = binary.Write(f.w, binary.BigEndian, frame.Status); err != nil { return } return nil } func (frame *HeadersFrame) write(f *Framer) error { return f.writeHeadersFrame(frame) } func (frame *WindowUpdateFrame) write(f *Framer) (err error) { frame.CFHeader.version = Version frame.CFHeader.frameType = TypeWindowUpdate frame.CFHeader.Flags = 0 frame.CFHeader.length = 8 // Serialize frame to Writer. if err = writeControlFrameHeader(f.w, frame.CFHeader); err != nil { return } if err = binary.Write(f.w, binary.BigEndian, frame.StreamId); err != nil { return } if err = binary.Write(f.w, binary.BigEndian, frame.DeltaWindowSize); err != nil { return } return nil } func (frame *DataFrame) write(f *Framer) error { return f.writeDataFrame(frame) } // WriteFrame writes a frame. func (f *Framer) WriteFrame(frame Frame) error { return frame.write(f) } func writeControlFrameHeader(w io.Writer, h ControlFrameHeader) error { if err := binary.Write(w, binary.BigEndian, 0x8000|h.version); err != nil { return err } if err := binary.Write(w, binary.BigEndian, h.frameType); err != nil { return err } flagsAndLength := uint32(h.Flags)<<24 | h.length if err := binary.Write(w, binary.BigEndian, flagsAndLength); err != nil { return err } return nil } func writeHeaderValueBlock(w io.Writer, h http.Header) (n int, err error) { n = 0 if err = binary.Write(w, binary.BigEndian, uint32(len(h))); err != nil { return } n += 2 for name, values := range h { if err = binary.Write(w, binary.BigEndian, uint32(len(name))); err != nil { return } n += 2 name = strings.ToLower(name) if _, err = io.WriteString(w, name); err != nil { return } n += len(name) v := strings.Join(values, headerValueSeparator) if err = binary.Write(w, binary.BigEndian, uint32(len(v))); err != nil { return } n += 2 if _, err = io.WriteString(w, v); err != nil { return } n += len(v) } return } func (f *Framer) writeSynStreamFrame(frame *SynStreamFrame) (err error) { if frame.StreamId == 0 { return &Error{ZeroStreamId, 0} } // Marshal the headers. var writer io.Writer = f.headerBuf if !f.headerCompressionDisabled { writer = f.headerCompressor } if _, err = writeHeaderValueBlock(writer, frame.Headers); err != nil { return } if !f.headerCompressionDisabled { f.headerCompressor.Flush() } // Set ControlFrameHeader. frame.CFHeader.version = Version frame.CFHeader.frameType = TypeSynStream frame.CFHeader.length = uint32(len(f.headerBuf.Bytes()) + 10) // Serialize frame to Writer. if err = writeControlFrameHeader(f.w, frame.CFHeader); err != nil { return err } if err = binary.Write(f.w, binary.BigEndian, frame.StreamId); err != nil { return err } if err = binary.Write(f.w, binary.BigEndian, frame.AssociatedToStreamId); err != nil { return err } if err = binary.Write(f.w, binary.BigEndian, frame.Priority<<5); err != nil { return err } if err = binary.Write(f.w, binary.BigEndian, frame.Slot); err != nil { return err } if _, err = f.w.Write(f.headerBuf.Bytes()); err != nil { return err } f.headerBuf.Reset() return nil } func (f *Framer) writeSynReplyFrame(frame *SynReplyFrame) (err error) { if frame.StreamId == 0 { return &Error{ZeroStreamId, 0} } // Marshal the headers. var writer io.Writer = f.headerBuf if !f.headerCompressionDisabled { writer = f.headerCompressor } if _, err = writeHeaderValueBlock(writer, frame.Headers); err != nil { return } if !f.headerCompressionDisabled { f.headerCompressor.Flush() } // Set ControlFrameHeader. frame.CFHeader.version = Version frame.CFHeader.frameType = TypeSynReply frame.CFHeader.length = uint32(len(f.headerBuf.Bytes()) + 4) // Serialize frame to Writer. if err = writeControlFrameHeader(f.w, frame.CFHeader); err != nil { return } if err = binary.Write(f.w, binary.BigEndian, frame.StreamId); err != nil { return } if _, err = f.w.Write(f.headerBuf.Bytes()); err != nil { return } f.headerBuf.Reset() return } func (f *Framer) writeHeadersFrame(frame *HeadersFrame) (err error) { if frame.StreamId == 0 { return &Error{ZeroStreamId, 0} } // Marshal the headers. var writer io.Writer = f.headerBuf if !f.headerCompressionDisabled { writer = f.headerCompressor } if _, err = writeHeaderValueBlock(writer, frame.Headers); err != nil { return } if !f.headerCompressionDisabled { f.headerCompressor.Flush() } // Set ControlFrameHeader. frame.CFHeader.version = Version frame.CFHeader.frameType = TypeHeaders frame.CFHeader.length = uint32(len(f.headerBuf.Bytes()) + 4) // Serialize frame to Writer. if err = writeControlFrameHeader(f.w, frame.CFHeader); err != nil { return } if err = binary.Write(f.w, binary.BigEndian, frame.StreamId); err != nil { return } if _, err = f.w.Write(f.headerBuf.Bytes()); err != nil { return } f.headerBuf.Reset() return } func (f *Framer) writeDataFrame(frame *DataFrame) (err error) { if frame.StreamId == 0 { return &Error{ZeroStreamId, 0} } if frame.StreamId&0x80000000 != 0 || len(frame.Data) > MaxDataLength { return &Error{InvalidDataFrame, frame.StreamId} } // Serialize frame to Writer. if err = binary.Write(f.w, binary.BigEndian, frame.StreamId); err != nil { return } flagsAndLength := uint32(frame.Flags)<<24 | uint32(len(frame.Data)) if err = binary.Write(f.w, binary.BigEndian, flagsAndLength); err != nil { return } if _, err = f.w.Write(frame.Data); err != nil { return } return nil } ���������������������������������������������������������������������������go.net/spdy/types.go��������������������������������������������������������������������������������0000644�0001751�0001751�00000017430�12235217213�014001� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package spdy implements the SPDY protocol (currently SPDY/3), described in // http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3. package spdy import ( "bytes" "compress/zlib" "io" "net/http" ) // Version is the protocol version number that this package implements. const Version = 3 // ControlFrameType stores the type field in a control frame header. type ControlFrameType uint16 const ( TypeSynStream ControlFrameType = 0x0001 TypeSynReply = 0x0002 TypeRstStream = 0x0003 TypeSettings = 0x0004 TypePing = 0x0006 TypeGoAway = 0x0007 TypeHeaders = 0x0008 TypeWindowUpdate = 0x0009 ) // ControlFlags are the flags that can be set on a control frame. type ControlFlags uint8 const ( ControlFlagFin ControlFlags = 0x01 ControlFlagUnidirectional = 0x02 ControlFlagSettingsClearSettings = 0x01 ) // DataFlags are the flags that can be set on a data frame. type DataFlags uint8 const ( DataFlagFin DataFlags = 0x01 ) // MaxDataLength is the maximum number of bytes that can be stored in one frame. const MaxDataLength = 1<<24 - 1 // headerValueSepator separates multiple header values. const headerValueSeparator = "\x00" // Frame is a single SPDY frame in its unpacked in-memory representation. Use // Framer to read and write it. type Frame interface { write(f *Framer) error } // ControlFrameHeader contains all the fields in a control frame header, // in its unpacked in-memory representation. type ControlFrameHeader struct { // Note, high bit is the "Control" bit. version uint16 // spdy version number frameType ControlFrameType Flags ControlFlags length uint32 // length of data field } type controlFrame interface { Frame read(h ControlFrameHeader, f *Framer) error } // StreamId represents a 31-bit value identifying the stream. type StreamId uint32 // SynStreamFrame is the unpacked, in-memory representation of a SYN_STREAM // frame. type SynStreamFrame struct { CFHeader ControlFrameHeader StreamId StreamId AssociatedToStreamId StreamId // stream id for a stream which this stream is associated to Priority uint8 // priority of this frame (3-bit) Slot uint8 // index in the server's credential vector of the client certificate Headers http.Header } // SynReplyFrame is the unpacked, in-memory representation of a SYN_REPLY frame. type SynReplyFrame struct { CFHeader ControlFrameHeader StreamId StreamId Headers http.Header } // RstStreamStatus represents the status that led to a RST_STREAM. type RstStreamStatus uint32 const ( ProtocolError RstStreamStatus = iota + 1 InvalidStream RefusedStream UnsupportedVersion Cancel InternalError FlowControlError StreamInUse StreamAlreadyClosed InvalidCredentials FrameTooLarge ) // RstStreamFrame is the unpacked, in-memory representation of a RST_STREAM // frame. type RstStreamFrame struct { CFHeader ControlFrameHeader StreamId StreamId Status RstStreamStatus } // SettingsFlag represents a flag in a SETTINGS frame. type SettingsFlag uint8 const ( FlagSettingsPersistValue SettingsFlag = 0x1 FlagSettingsPersisted = 0x2 ) // SettingsFlag represents the id of an id/value pair in a SETTINGS frame. type SettingsId uint32 const ( SettingsUploadBandwidth SettingsId = iota + 1 SettingsDownloadBandwidth SettingsRoundTripTime SettingsMaxConcurrentStreams SettingsCurrentCwnd SettingsDownloadRetransRate SettingsInitialWindowSize SettingsClientCretificateVectorSize ) // SettingsFlagIdValue is the unpacked, in-memory representation of the // combined flag/id/value for a setting in a SETTINGS frame. type SettingsFlagIdValue struct { Flag SettingsFlag Id SettingsId Value uint32 } // SettingsFrame is the unpacked, in-memory representation of a SPDY // SETTINGS frame. type SettingsFrame struct { CFHeader ControlFrameHeader FlagIdValues []SettingsFlagIdValue } // PingFrame is the unpacked, in-memory representation of a PING frame. type PingFrame struct { CFHeader ControlFrameHeader Id uint32 // unique id for this ping, from server is even, from client is odd. } // GoAwayStatus represents the status in a GoAwayFrame. type GoAwayStatus uint32 const ( GoAwayOK GoAwayStatus = iota GoAwayProtocolError GoAwayInternalError ) // GoAwayFrame is the unpacked, in-memory representation of a GOAWAY frame. type GoAwayFrame struct { CFHeader ControlFrameHeader LastGoodStreamId StreamId // last stream id which was accepted by sender Status GoAwayStatus } // HeadersFrame is the unpacked, in-memory representation of a HEADERS frame. type HeadersFrame struct { CFHeader ControlFrameHeader StreamId StreamId Headers http.Header } // WindowUpdateFrame is the unpacked, in-memory representation of a // WINDOW_UPDATE frame. type WindowUpdateFrame struct { CFHeader ControlFrameHeader StreamId StreamId DeltaWindowSize uint32 // additional number of bytes to existing window size } // TODO: Implement credential frame and related methods. // DataFrame is the unpacked, in-memory representation of a DATA frame. type DataFrame struct { // Note, high bit is the "Control" bit. Should be 0 for data frames. StreamId StreamId Flags DataFlags Data []byte // payload data of this frame } // A SPDY specific error. type ErrorCode string const ( UnlowercasedHeaderName ErrorCode = "header was not lowercased" DuplicateHeaders = "multiple headers with same name" WrongCompressedPayloadSize = "compressed payload size was incorrect" UnknownFrameType = "unknown frame type" InvalidControlFrame = "invalid control frame" InvalidDataFrame = "invalid data frame" InvalidHeaderPresent = "frame contained invalid header" ZeroStreamId = "stream id zero is disallowed" ) // Error contains both the type of error and additional values. StreamId is 0 // if Error is not associated with a stream. type Error struct { Err ErrorCode StreamId StreamId } func (e *Error) Error() string { return string(e.Err) } var invalidReqHeaders = map[string]bool{ "Connection": true, "Host": true, "Keep-Alive": true, "Proxy-Connection": true, "Transfer-Encoding": true, } var invalidRespHeaders = map[string]bool{ "Connection": true, "Keep-Alive": true, "Proxy-Connection": true, "Transfer-Encoding": true, } // Framer handles serializing/deserializing SPDY frames, including compressing/ // decompressing payloads. type Framer struct { headerCompressionDisabled bool w io.Writer headerBuf *bytes.Buffer headerCompressor *zlib.Writer r io.Reader headerReader io.LimitedReader headerDecompressor io.ReadCloser } // NewFramer allocates a new Framer for a given SPDY connection, repesented by // a io.Writer and io.Reader. Note that Framer will read and write individual fields // from/to the Reader and Writer, so the caller should pass in an appropriately // buffered implementation to optimize performance. func NewFramer(w io.Writer, r io.Reader) (*Framer, error) { compressBuf := new(bytes.Buffer) compressor, err := zlib.NewWriterLevelDict(compressBuf, zlib.BestCompression, []byte(headerDictionary)) if err != nil { return nil, err } framer := &Framer{ w: w, headerBuf: compressBuf, headerCompressor: compressor, r: r, } return framer, nil } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/AUTHORS��������������������������������������������������������������������������������������0000644�0001751�0001751�00000000255�12235217213�012374� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This source code refers to The Go Authors for copyright purposes. # The master list of authors is in the main Go distribution, # visible at http://tip.golang.org/AUTHORS. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/proxy/���������������������������������������������������������������������������������������0000755�0001751�0001751�00000000000�12235217213�012503� 5����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/proxy/proxy_test.go��������������������������������������������������������������������������0000644�0001751�0001751�00000006470�12235217213�015261� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package proxy import ( "io" "net" "net/url" "strconv" "sync" "testing" ) func TestFromURL(t *testing.T) { endSystem, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { t.Fatalf("net.Listen failed: %v", err) } defer endSystem.Close() gateway, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { t.Fatalf("net.Listen failed: %v", err) } defer gateway.Close() var wg sync.WaitGroup wg.Add(1) go socks5Gateway(t, gateway, endSystem, socks5Domain, &wg) url, err := url.Parse("socks5://user:password@" + gateway.Addr().String()) if err != nil { t.Fatalf("url.Parse failed: %v", err) } proxy, err := FromURL(url, Direct) if err != nil { t.Fatalf("FromURL failed: %v", err) } _, port, err := net.SplitHostPort(endSystem.Addr().String()) if err != nil { t.Fatalf("net.SplitHostPort failed: %v", err) } if c, err := proxy.Dial("tcp", "localhost:"+port); err != nil { t.Fatalf("FromURL.Dial failed: %v", err) } else { c.Close() } wg.Wait() } func TestSOCKS5(t *testing.T) { endSystem, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { t.Fatalf("net.Listen failed: %v", err) } defer endSystem.Close() gateway, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { t.Fatalf("net.Listen failed: %v", err) } defer gateway.Close() var wg sync.WaitGroup wg.Add(1) go socks5Gateway(t, gateway, endSystem, socks5IP4, &wg) proxy, err := SOCKS5("tcp", gateway.Addr().String(), nil, Direct) if err != nil { t.Fatalf("SOCKS5 failed: %v", err) } if c, err := proxy.Dial("tcp", endSystem.Addr().String()); err != nil { t.Fatalf("SOCKS5.Dial failed: %v", err) } else { c.Close() } wg.Wait() } func socks5Gateway(t *testing.T, gateway, endSystem net.Listener, typ byte, wg *sync.WaitGroup) { defer wg.Done() c, err := gateway.Accept() if err != nil { t.Errorf("net.Listener.Accept failed: %v", err) return } defer c.Close() b := make([]byte, 32) var n int if typ == socks5Domain { n = 4 } else { n = 3 } if _, err := io.ReadFull(c, b[:n]); err != nil { t.Errorf("io.ReadFull failed: %v", err) return } if _, err := c.Write([]byte{socks5Version, socks5AuthNone}); err != nil { t.Errorf("net.Conn.Write failed: %v", err) return } if typ == socks5Domain { n = 16 } else { n = 10 } if _, err := io.ReadFull(c, b[:n]); err != nil { t.Errorf("io.ReadFull failed: %v", err) return } if b[0] != socks5Version || b[1] != socks5Connect || b[2] != 0x00 || b[3] != typ { t.Errorf("got an unexpected packet: %#02x %#02x %#02x %#02x", b[0], b[1], b[2], b[3]) return } if typ == socks5Domain { copy(b[:5], []byte{socks5Version, 0x00, 0x00, socks5Domain, 9}) b = append(b, []byte("localhost")...) } else { copy(b[:4], []byte{socks5Version, 0x00, 0x00, socks5IP4}) } host, port, err := net.SplitHostPort(endSystem.Addr().String()) if err != nil { t.Errorf("net.SplitHostPort failed: %v", err) return } b = append(b, []byte(net.ParseIP(host).To4())...) p, err := strconv.Atoi(port) if err != nil { t.Errorf("strconv.Atoi failed: %v", err) return } b = append(b, []byte{byte(p >> 8), byte(p)}...) if _, err := c.Write(b); err != nil { t.Errorf("net.Conn.Write failed: %v", err) return } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/proxy/per_host_test.go�����������������������������������������������������������������������0000644�0001751�0001751�00000002415�12235217213�015716� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package proxy import ( "errors" "net" "reflect" "testing" ) type recordingProxy struct { addrs []string } func (r *recordingProxy) Dial(network, addr string) (net.Conn, error) { r.addrs = append(r.addrs, addr) return nil, errors.New("recordingProxy") } func TestPerHost(t *testing.T) { var def, bypass recordingProxy perHost := NewPerHost(&def, &bypass) perHost.AddFromString("localhost,*.zone,127.0.0.1,10.0.0.1/8,1000::/16") expectedDef := []string{ "example.com:123", "1.2.3.4:123", "[1001::]:123", } expectedBypass := []string{ "localhost:123", "zone:123", "foo.zone:123", "127.0.0.1:123", "10.1.2.3:123", "[1000::]:123", } for _, addr := range expectedDef { perHost.Dial("tcp", addr) } for _, addr := range expectedBypass { perHost.Dial("tcp", addr) } if !reflect.DeepEqual(expectedDef, def.addrs) { t.Errorf("Hosts which went to the default proxy didn't match. Got %v, want %v", def.addrs, expectedDef) } if !reflect.DeepEqual(expectedBypass, bypass.addrs) { t.Errorf("Hosts which went to the bypass proxy didn't match. Got %v, want %v", bypass.addrs, expectedBypass) } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/proxy/direct.go������������������������������������������������������������������������������0000644�0001751�0001751�00000000630�12235217213�014303� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package proxy import ( "net" ) type direct struct{} // Direct is a direct proxy: one that makes network connections directly. var Direct = direct{} func (direct) Dial(network, addr string) (net.Conn, error) { return net.Dial(network, addr) } ��������������������������������������������������������������������������������������������������������go.net/proxy/socks5.go������������������������������������������������������������������������������0000644�0001751�0001751�00000012706�12235217213�014247� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package proxy import ( "errors" "io" "net" "strconv" ) // SOCKS5 returns a Dialer that makes SOCKSv5 connections to the given address // with an optional username and password. See RFC 1928. func SOCKS5(network, addr string, auth *Auth, forward Dialer) (Dialer, error) { s := &socks5{ network: network, addr: addr, forward: forward, } if auth != nil { s.user = auth.User s.password = auth.Password } return s, nil } type socks5 struct { user, password string network, addr string forward Dialer } const socks5Version = 5 const ( socks5AuthNone = 0 socks5AuthPassword = 2 ) const socks5Connect = 1 const ( socks5IP4 = 1 socks5Domain = 3 socks5IP6 = 4 ) var socks5Errors = []string{ "", "general failure", "connection forbidden", "network unreachable", "host unreachable", "connection refused", "TTL expired", "command not supported", "address type not supported", } // Dial connects to the address addr on the network net via the SOCKS5 proxy. func (s *socks5) Dial(network, addr string) (net.Conn, error) { switch network { case "tcp", "tcp6", "tcp4": default: return nil, errors.New("proxy: no support for SOCKS5 proxy connections of type " + network) } conn, err := s.forward.Dial(s.network, s.addr) if err != nil { return nil, err } closeConn := &conn defer func() { if closeConn != nil { (*closeConn).Close() } }() host, portStr, err := net.SplitHostPort(addr) if err != nil { return nil, err } port, err := strconv.Atoi(portStr) if err != nil { return nil, 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) } // the size here is just an estimate buf := make([]byte, 0, 6+len(host)) buf = append(buf, socks5Version) if len(s.user) > 0 && len(s.user) < 256 && len(s.password) < 256 { buf = append(buf, 2 /* num auth methods */, socks5AuthNone, socks5AuthPassword) } else { buf = append(buf, 1 /* num auth methods */, socks5AuthNone) } if _, err := conn.Write(buf); err != nil { return nil, 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()) } if buf[0] != 5 { return nil, 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") } if buf[1] == socks5AuthPassword { buf = buf[:0] buf = append(buf, 1 /* password protocol version */) buf = append(buf, uint8(len(s.user))) buf = append(buf, s.user...) buf = append(buf, uint8(len(s.password))) 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()) } 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()) } if buf[1] != 0 { return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " rejected username/password") } } buf = buf[:0] buf = append(buf, socks5Version, socks5Connect, 0 /* reserved */) if ip := net.ParseIP(host); ip != nil { if ip4 := ip.To4(); ip4 != nil { buf = append(buf, socks5IP4) ip = ip4 } else { buf = append(buf, socks5IP6) } buf = append(buf, ip...) } else { buf = append(buf, socks5Domain) buf = append(buf, byte(len(host))) buf = append(buf, host...) } 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()) } 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()) } failure := "unknown error" if int(buf[1]) < len(socks5Errors) { failure = socks5Errors[buf[1]] } if len(failure) > 0 { return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " failed to connect: " + failure) } bytesToDiscard := 0 switch buf[3] { case socks5IP4: bytesToDiscard = net.IPv4len case socks5IP6: bytesToDiscard = net.IPv6len 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()) } 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) } if cap(buf) < bytesToDiscard { buf = make([]byte, bytesToDiscard) } else { 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()) } // 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()) } closeConn = nil return conn, nil } ����������������������������������������������������������go.net/proxy/proxy.go�������������������������������������������������������������������������������0000644�0001751�0001751�00000004544�12235217213�014222� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package proxy provides support for a variety of protocols to proxy network // data. package proxy import ( "errors" "net" "net/url" "os" ) // A Dialer is a means to establish a connection. type Dialer interface { // Dial connects to the given address via the proxy. Dial(network, addr string) (c net.Conn, err error) } // Auth contains authentication parameters that specific Dialers may require. type Auth struct { User, Password string } // FromEnvironment returns the dialer specified by the proxy related variables in // the environment. func FromEnvironment() Dialer { allProxy := os.Getenv("all_proxy") if len(allProxy) == 0 { return Direct } proxyURL, err := url.Parse(allProxy) if err != nil { return Direct } proxy, err := FromURL(proxyURL, Direct) if err != nil { return Direct } noProxy := os.Getenv("no_proxy") if len(noProxy) == 0 { return proxy } perHost := NewPerHost(proxy, Direct) perHost.AddFromString(noProxy) return perHost } // proxySchemes is a map from URL schemes to a function that creates a Dialer // from a URL with such a scheme. var proxySchemes map[string]func(*url.URL, Dialer) (Dialer, error) // RegisterDialerType takes a URL scheme and a function to generate Dialers from // a URL with that scheme and a forwarding Dialer. Registered schemes are used // by FromURL. func RegisterDialerType(scheme string, f func(*url.URL, Dialer) (Dialer, error)) { if proxySchemes == nil { proxySchemes = make(map[string]func(*url.URL, Dialer) (Dialer, error)) } proxySchemes[scheme] = f } // FromURL returns a Dialer given a URL specification and an underlying // Dialer for it to make network requests. func FromURL(u *url.URL, forward Dialer) (Dialer, error) { var auth *Auth if u.User != nil { auth = new(Auth) auth.User = u.User.Username() if p, ok := u.User.Password(); ok { auth.Password = p } } switch u.Scheme { case "socks5": return SOCKS5("tcp", u.Host, auth, forward) } // If the scheme doesn't match any of the built-in schemes, see if it // was registered by another package. if proxySchemes != nil { if f, ok := proxySchemes[u.Scheme]; ok { return f(u, forward) } } return nil, errors.New("proxy: unknown scheme: " + u.Scheme) } ������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/proxy/per_host.go����������������������������������������������������������������������������0000644�0001751�0001751�00000007174�12235217213�014666� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package proxy import ( "net" "strings" ) // A PerHost directs connections to a default Dialer unless the hostname // requested matches one of a number of exceptions. type PerHost struct { def, bypass Dialer bypassNetworks []*net.IPNet bypassIPs []net.IP bypassZones []string bypassHosts []string } // NewPerHost returns a PerHost Dialer that directs connections to either // defaultDialer or bypass, depending on whether the connection matches one of // the configured rules. func NewPerHost(defaultDialer, bypass Dialer) *PerHost { return &PerHost{ def: defaultDialer, bypass: bypass, } } // Dial connects to the address addr on the given network through either // defaultDialer or bypass. func (p *PerHost) Dial(network, addr string) (c net.Conn, err error) { host, _, err := net.SplitHostPort(addr) if err != nil { return nil, err } return p.dialerForRequest(host).Dial(network, addr) } func (p *PerHost) dialerForRequest(host string) Dialer { if ip := net.ParseIP(host); ip != nil { for _, net := range p.bypassNetworks { if net.Contains(ip) { return p.bypass } } for _, bypassIP := range p.bypassIPs { if bypassIP.Equal(ip) { return p.bypass } } return p.def } for _, zone := range p.bypassZones { if strings.HasSuffix(host, zone) { return p.bypass } if host == zone[1:] { // For a zone "example.com", we match "example.com" // too. return p.bypass } } for _, bypassHost := range p.bypassHosts { if bypassHost == host { return p.bypass } } return p.def } // AddFromString parses a string that contains comma-separated values // specifying hosts that should use the bypass proxy. Each value is either an // IP address, a CIDR range, a zone (*.example.com) or a hostname // (localhost). A best effort is made to parse the string and errors are // ignored. func (p *PerHost) AddFromString(s string) { hosts := strings.Split(s, ",") for _, host := range hosts { host = strings.TrimSpace(host) if len(host) == 0 { continue } if strings.Contains(host, "/") { // We assume that it's a CIDR address like 127.0.0.0/8 if _, net, err := net.ParseCIDR(host); err == nil { p.AddNetwork(net) } continue } if ip := net.ParseIP(host); ip != nil { p.AddIP(ip) continue } if strings.HasPrefix(host, "*.") { p.AddZone(host[1:]) continue } p.AddHost(host) } } // AddIP specifies an IP address that will use the bypass proxy. Note that // this will only take effect if a literal IP address is dialed. A connection // to a named host will never match an IP. func (p *PerHost) AddIP(ip net.IP) { p.bypassIPs = append(p.bypassIPs, ip) } // AddNetwork specifies an IP range that will use the bypass proxy. Note that // this will only take effect if a literal IP address is dialed. A connection // to a named host will never match. func (p *PerHost) AddNetwork(net *net.IPNet) { p.bypassNetworks = append(p.bypassNetworks, net) } // AddZone specifies a DNS suffix that will use the bypass proxy. A zone of // "example.com" matches "example.com" and all of its subdomains. func (p *PerHost) AddZone(zone string) { if strings.HasSuffix(zone, ".") { zone = zone[:len(zone)-1] } if !strings.HasPrefix(zone, ".") { zone = "." + zone } p.bypassZones = append(p.bypassZones, zone) } // AddHost specifies a hostname that will use the bypass proxy. func (p *PerHost) AddHost(host string) { if strings.HasSuffix(host, ".") { host = host[:len(host)-1] } p.bypassHosts = append(p.bypassHosts, host) } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/idna/����������������������������������������������������������������������������������������0000755�0001751�0001751�00000000000�12235217213�012235� 5����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/idna/idna_test.go����������������������������������������������������������������������������0000644�0001751�0001751�00000002115�12235217213�014535� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// 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. package idna import ( "testing" ) var idnaTestCases = [...]struct { ascii, unicode string }{ // Labels. {"books", "books"}, {"xn--bcher-kva", "bücher"}, // Domains. {"foo--xn--bar.org", "foo--xn--bar.org"}, {"golang.org", "golang.org"}, {"example.xn--p1ai", "example.рф"}, {"xn--czrw28b.tw", "商業.tw"}, {"www.xn--mller-kva.de", "www.müller.de"}, } func TestIDNA(t *testing.T) { for _, tc := range idnaTestCases { if a, err := ToASCII(tc.unicode); err != nil { t.Errorf("ToASCII(%q): %v", tc.unicode, err) } else if a != tc.ascii { t.Errorf("ToASCII(%q): got %q, want %q", tc.unicode, a, tc.ascii) } if u, err := ToUnicode(tc.ascii); err != nil { t.Errorf("ToUnicode(%q): %v", tc.ascii, err) } else if u != tc.unicode { t.Errorf("ToUnicode(%q): got %q, want %q", tc.ascii, u, tc.unicode) } } } // TODO(nigeltao): test errors, once we've specified when ToASCII and ToUnicode // return errors. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/idna/idna.go���������������������������������������������������������������������������������0000644�0001751�0001751�00000003356�12235217213�013506� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// 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. // Package idna implements IDNA2008 (Internationalized Domain Names for // Applications), defined in RFC 5890, RFC 5891, RFC 5892, RFC 5893 and // RFC 5894. package idna import ( "strings" "unicode/utf8" ) // TODO(nigeltao): specify when errors occur. For example, is ToASCII(".") or // ToASCII("foo\x00") an error? See also http://www.unicode.org/faq/idn.html#11 // acePrefix is the ASCII Compatible Encoding prefix. const acePrefix = "xn--" // ToASCII converts a domain or domain label to its ASCII form. For example, // ToASCII("bücher.example.com") is "xn--bcher-kva.example.com", and // ToASCII("golang") is "golang". func ToASCII(s string) (string, error) { if ascii(s) { return s, nil } labels := strings.Split(s, ".") for i, label := range labels { if !ascii(label) { a, err := encode(acePrefix, label) if err != nil { return "", err } labels[i] = a } } return strings.Join(labels, "."), nil } // ToUnicode converts a domain or domain label to its Unicode form. For example, // ToUnicode("xn--bcher-kva.example.com") is "bücher.example.com", and // ToUnicode("golang") is "golang". func ToUnicode(s string) (string, error) { if !strings.Contains(s, acePrefix) { return s, nil } labels := strings.Split(s, ".") for i, label := range labels { if strings.HasPrefix(label, acePrefix) { u, err := decode(label[len(acePrefix):]) if err != nil { return "", err } labels[i] = u } } return strings.Join(labels, "."), nil } func ascii(s string) bool { for i := 0; i < len(s); i++ { if s[i] >= utf8.RuneSelf { return false } } return true } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/idna/punycode_test.go������������������������������������������������������������������������0000644�0001751�0001751�00000013433�12235217213�015455� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// 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. package idna import ( "strings" "testing" ) var punycodeTestCases = [...]struct { s, encoded string }{ {"", ""}, {"-", "--"}, {"-a", "-a-"}, {"-a-", "-a--"}, {"a", "a-"}, {"a-", "a--"}, {"a-b", "a-b-"}, {"books", "books-"}, {"bücher", "bcher-kva"}, {"Hello世界", "Hello-ck1hg65u"}, {"ü", "tda"}, {"üý", "tdac"}, // The test cases below come from RFC 3492 section 7.1 with Errata 3026. { // (A) Arabic (Egyptian). "\u0644\u064A\u0647\u0645\u0627\u0628\u062A\u0643\u0644" + "\u0645\u0648\u0634\u0639\u0631\u0628\u064A\u061F", "egbpdaj6bu4bxfgehfvwxn", }, { // (B) Chinese (simplified). "\u4ED6\u4EEC\u4E3A\u4EC0\u4E48\u4E0D\u8BF4\u4E2D\u6587", "ihqwcrb4cv8a8dqg056pqjye", }, { // (C) Chinese (traditional). "\u4ED6\u5011\u7232\u4EC0\u9EBD\u4E0D\u8AAA\u4E2D\u6587", "ihqwctvzc91f659drss3x8bo0yb", }, { // (D) Czech. "\u0050\u0072\u006F\u010D\u0070\u0072\u006F\u0073\u0074" + "\u011B\u006E\u0065\u006D\u006C\u0075\u0076\u00ED\u010D" + "\u0065\u0073\u006B\u0079", "Proprostnemluvesky-uyb24dma41a", }, { // (E) Hebrew. "\u05DC\u05DE\u05D4\u05D4\u05DD\u05E4\u05E9\u05D5\u05D8" + "\u05DC\u05D0\u05DE\u05D3\u05D1\u05E8\u05D9\u05DD\u05E2" + "\u05D1\u05E8\u05D9\u05EA", "4dbcagdahymbxekheh6e0a7fei0b", }, { // (F) Hindi (Devanagari). "\u092F\u0939\u0932\u094B\u0917\u0939\u093F\u0928\u094D" + "\u0926\u0940\u0915\u094D\u092F\u094B\u0902\u0928\u0939" + "\u0940\u0902\u092C\u094B\u0932\u0938\u0915\u0924\u0947" + "\u0939\u0948\u0902", "i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd", }, { // (G) Japanese (kanji and hiragana). "\u306A\u305C\u307F\u3093\u306A\u65E5\u672C\u8A9E\u3092" + "\u8A71\u3057\u3066\u304F\u308C\u306A\u3044\u306E\u304B", "n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa", }, { // (H) Korean (Hangul syllables). "\uC138\uACC4\uC758\uBAA8\uB4E0\uC0AC\uB78C\uB4E4\uC774" + "\uD55C\uAD6D\uC5B4\uB97C\uC774\uD574\uD55C\uB2E4\uBA74" + "\uC5BC\uB9C8\uB098\uC88B\uC744\uAE4C", "989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5j" + "psd879ccm6fea98c", }, { // (I) Russian (Cyrillic). "\u043F\u043E\u0447\u0435\u043C\u0443\u0436\u0435\u043E" + "\u043D\u0438\u043D\u0435\u0433\u043E\u0432\u043E\u0440" + "\u044F\u0442\u043F\u043E\u0440\u0443\u0441\u0441\u043A" + "\u0438", "b1abfaaepdrnnbgefbadotcwatmq2g4l", }, { // (J) Spanish. "\u0050\u006F\u0072\u0071\u0075\u00E9\u006E\u006F\u0070" + "\u0075\u0065\u0064\u0065\u006E\u0073\u0069\u006D\u0070" + "\u006C\u0065\u006D\u0065\u006E\u0074\u0065\u0068\u0061" + "\u0062\u006C\u0061\u0072\u0065\u006E\u0045\u0073\u0070" + "\u0061\u00F1\u006F\u006C", "PorqunopuedensimplementehablarenEspaol-fmd56a", }, { // (K) Vietnamese. "\u0054\u1EA1\u0069\u0073\u0061\u006F\u0068\u1ECD\u006B" + "\u0068\u00F4\u006E\u0067\u0074\u0068\u1EC3\u0063\u0068" + "\u1EC9\u006E\u00F3\u0069\u0074\u0069\u1EBF\u006E\u0067" + "\u0056\u0069\u1EC7\u0074", "TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g", }, { // (L) 3<nen>B<gumi><kinpachi><sensei>. "\u0033\u5E74\u0042\u7D44\u91D1\u516B\u5148\u751F", "3B-ww4c5e180e575a65lsy2b", }, { // (M) <amuro><namie>-with-SUPER-MONKEYS. "\u5B89\u5BA4\u5948\u7F8E\u6075\u002D\u0077\u0069\u0074" + "\u0068\u002D\u0053\u0055\u0050\u0045\u0052\u002D\u004D" + "\u004F\u004E\u004B\u0045\u0059\u0053", "-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n", }, { // (N) Hello-Another-Way-<sorezore><no><basho>. "\u0048\u0065\u006C\u006C\u006F\u002D\u0041\u006E\u006F" + "\u0074\u0068\u0065\u0072\u002D\u0057\u0061\u0079\u002D" + "\u305D\u308C\u305E\u308C\u306E\u5834\u6240", "Hello-Another-Way--fc4qua05auwb3674vfr0b", }, { // (O) <hitotsu><yane><no><shita>2. "\u3072\u3068\u3064\u5C4B\u6839\u306E\u4E0B\u0032", "2-u9tlzr9756bt3uc0v", }, { // (P) Maji<de>Koi<suru>5<byou><mae> "\u004D\u0061\u006A\u0069\u3067\u004B\u006F\u0069\u3059" + "\u308B\u0035\u79D2\u524D", "MajiKoi5-783gue6qz075azm5e", }, { // (Q) <pafii>de<runba> "\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", "de-jg4avhby1noc0d", }, { // (R) <sono><supiido><de> "\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067", "d9juau41awczczp", }, { // (S) -> $1.00 <- "\u002D\u003E\u0020\u0024\u0031\u002E\u0030\u0030\u0020" + "\u003C\u002D", "-> $1.00 <--", }, } func TestPunycode(t *testing.T) { for _, tc := range punycodeTestCases { if got, err := decode(tc.encoded); err != nil { t.Errorf("decode(%q): %v", tc.encoded, err) } else if got != tc.s { t.Errorf("decode(%q): got %q, want %q", tc.encoded, got, tc.s) } if got, err := encode("", tc.s); err != nil { t.Errorf(`encode("", %q): %v`, tc.s, err) } else if got != tc.encoded { t.Errorf(`encode("", %q): got %q, want %q`, tc.s, got, tc.encoded) } } } var punycodeErrorTestCases = [...]string{ "decode -", // A sole '-' is invalid. "decode foo\x00bar", // '\x00' is not in [0-9A-Za-z]. "decode foo#bar", // '#' is not in [0-9A-Za-z]. "decode foo\u00A3bar", // '\u00A3' is not in [0-9A-Za-z]. "decode 9", // "9a" decodes to codepoint \u00A3; "9" is truncated. "decode 99999a", // "99999a" decodes to codepoint \U0048A3C1, which is > \U0010FFFF. "decode 9999999999a", // "9999999999a" overflows the int32 calculation. "encode " + strings.Repeat("x", 65536) + "\uff00", // int32 overflow. } func TestPunycodeErrors(t *testing.T) { for _, tc := range punycodeErrorTestCases { var err error switch { case strings.HasPrefix(tc, "decode "): _, err = decode(tc[7:]) case strings.HasPrefix(tc, "encode "): _, err = encode("", tc[7:]) } if err == nil { if len(tc) > 256 { tc = tc[:100] + "..." + tc[len(tc)-100:] } t.Errorf("no error for %s", tc) } } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������go.net/idna/punycode.go�����������������������������������������������������������������������������0000644�0001751�0001751�00000010537�12235217213�014420� 0����������������������������������������������������������������������������������������������������ustar �spiro���������������������������spiro������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// 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. package idna // This file implements the Punycode algorithm from RFC 3492. import ( "fmt" "math" "strings" "unicode/utf8" ) // These parameter values are specified in section 5. // // All computation is done with int32s, so that overflow behavior is identical // regardless of whether int is 32-bit or 64-bit. const ( base int32 = 36 damp int32 = 700 initialBias int32 = 72 initialN int32 = 128 skew int32 = 38 tmax int32 = 26 tmin int32 = 1 ) // decode decodes a string as specified in section 6.2. func decode(encoded string) (string, error) { if encoded == "" { return "", nil } pos := 1 + strings.LastIndex(encoded, "-") if pos == 1 { return "", fmt.Errorf("idna: invalid label %q", encoded) } if pos == len(encoded) { return encoded[:len(encoded)-1], nil } output := make([]rune, 0, len(encoded)) if pos != 0 { for _, r := range encoded[:pos-1] { output = append(output, r) } } i, n, bias := int32(0), initialN, initialBias for pos < len(encoded) { oldI, w := i, int32(1) for k := base; ; k += base { if pos == len(encoded) { return "", fmt.Errorf("idna: invalid label %q", encoded) } digit, ok := decodeDigit(encoded[pos]) if !ok { return "", fmt.Errorf("idna: invalid label %q", encoded) } pos++ i += digit * w if i < 0 { return "", fmt.Errorf("idna: invalid label %q", encoded) } t := k - bias if t < tmin { t = tmin } else if t > tmax { t = tmax } if digit < t { break } w *= base - t if w >= math.MaxInt32/base { return "", fmt.Errorf("idna: invalid label %q", encoded) } } x := int32(len(output) + 1) bias = adapt(i-oldI, x, oldI == 0) n += i / x i %= x if n > utf8.MaxRune || len(output) >= 1024 { return "", fmt.Errorf("idna: invalid label %q", encoded) } output = append(output, 0) copy(output[i+1:], output[i:]) output[i] = n i++ } return string(output), nil } // encode encodes a string as specified in section 6.3 and prepends prefix to // the result. // // The "while h < length(input)" line in the specification becomes "for // remaining != 0" in the Go code, because len(s) in Go is in bytes, not runes. func encode(prefix, s string) (string, error) { output := make([]byte, len(prefix), len(prefix)+1+2*len(s)) copy(output, prefix) delta, n, bias := int32(0), initialN, initialBias b, remaining := int32(0), int32(0) for _, r := range s { if r < 0x80 { b++ output = append(output, byte(r)) } else { remaining++ } } h := b if b > 0 { output = append(output, '-') } for remaining != 0 { m := int32(0x7fffffff) for _, r := range s { if m > r && r >= n { m = r } } delta += (m - n) * (h + 1) if delta < 0 { return "", fmt.Errorf("idna: invalid label %q", s) } n = m for _, r := range s { if r < n { delta++ if delta < 0 { return "", fmt.Errorf("idna: invalid label %q", s) } continue } if r > n { continue } q := delta for k := base; ; k += base { t := k - bias if t < tmin { t = tmin } else if t > tmax { t = tmax } if q < t { break } output = append(output, encodeDigit(t+(q-t)%(base-t))) q = (q - t) / (base - t) } output = append(output, encodeDigit(q)) bias = adapt(delta, h+1, h == b) delta = 0 h++ remaining-- } delta++ n++ } return string(output), nil } func decodeDigit(x byte) (digit int32, ok bool) { switch { case '0' <= x && x <= '9': return int32(x - ('0' - 26)), true case 'A' <= x && x <= 'Z': return int32(x - 'A'), true case 'a' <= x && x <= 'z': return int32(x - 'a'), true } return 0, false } func encodeDigit(digit int32) byte { switch { case 0 <= digit && digit < 26: return byte(digit + 'a') case 26 <= digit && digit < 36: return byte(digit + ('0' - 26)) } panic("idna: internal error in punycode encoding") } // adapt is the bias adaptation function specified in section 6.1. func adapt(delta, numPoints int32, firstTime bool) int32 { if firstTime { delta /= damp } else { delta /= 2 } delta += delta / numPoints k := int32(0) for delta > ((base-tmin)*tmax)/2 { delta /= base - tmin k += base } return k + (base-tmin+1)*delta/(delta+skew) } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������